2015-09-15 21 views
15

Mam dodać UICollectionView do mojego UIViewController i zrobiłem niestandardową komórkę dla niego.UICollectionViewCell treści niewłaściwy rozmiar przy pierwszym obciążeniu

Ustawię rozmiar komórki za pomocą metody sizeForItemAtIndexPath i ustaw każdą komórkę na UIScreen.mainScreen().bounds.width/2 zarówno pod względem wysokości, jak i szerokości. Zasadniczo każda komórka ma połowę szerokości ekranu i tej samej długości.

Mam wtedy wewnątrz komórki komórkę UIImageView z każdą krawędzią przypiętą do jej względnej krawędzi komórki, dzięki czemu obraz wypełnia komórkę. Mam również UILabel, który jest wyśrodkowany zarówno w pionie, jak iw poziomie w komórce.

Jednak przy pierwszym załadowaniu komórka ma prawidłowy rozmiar, ale zawartość jest znacznie mniejsza na małym kwadracie w lewym górnym rogu. (Na poniższym obrazku ustawiłem zawartość komórki: kolor tła na zielony, a na obrazie kolor tła na czerwony).

enter image description here

Następnie po przewinięciu w dół trochę (i zakładam wielokrotnego użytku komórka jest rozkolejkowywana) wszystkie komórki są w porządku (i pozostają w porządku po przewinięciu kopię zapasową).

enter image description here

Co jest przyczyną treść nie może być ograniczone odpowiednio na pierwszym obciążeniu?

UPDATE

Niektóre kodu z mojego UIViewController:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     var cell = collectionView.dequeueReusableCellWithReuseIdentifier("PrevDrawCell", forIndexPath: indexPath) as? PrevDrawCell 

     if cell == nil { 
      cell = PrevDrawCell() 
     } 

     cell!.drawVC = self 
     cell!.imageShortCode = self.tempImageURLs[indexPath.row] 

     // Pull image (async) and set after download 
     cell!.setupImage() 

     cell!.contentView.backgroundColor = UIColor.greenColor() 
     cell!.coverView.backgroundColor = UIColor.redColor() 

     cell!.dateLabel.font = UIFont(name: "HelveticaNeue-Light", size: 26) 
     cell!.dateLabel.text = "\(self.tempImageURLs.count-indexPath.row)/9" 

     return cell! 
} 

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
    let size = UIScreen.mainScreen().bounds.width/2 
     return CGSize(width: size, height: size) 
} 


func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { 
     return UIEdgeInsetsZero 
} 

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat { 
    return 0 
} 

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat { 
    return 0 
} 
+0

Pokaż 'UIViewController' – Arsen

+0

Masz na myśli przedstawienie kodu dla' UIViewController'? – myles

+0

tak, pokaż kod – Arsen

Odpowiedz

38

Wygląda na to, że nadal zachowuje to 100x100px podstawowy rozmiar dla contentView a sama komórka staje się już odpowiedni rozmiar. można wymusić, aby zresetować układ dodając następującą linię tuż przed powrotu komórkę:

cell?.layoutIfNeeded() 
+1

Niesamowita odpowiedź, uratowałeś mój dzień! – Himanshu

+0

W końcu użyłem tej funkcji i działało zgodnie z oczekiwaniami. Dzięki! –

+1

Użyj ** layoutIfNeeded() **, aby rozwiązać problemy związane z rozmiarami, które możesz napotkać, gdy komórka lub widok ładuje się po raz pierwszy, chyba że zadzwonisz ** layoutIfNeeded() ** będzie czekać na następny cykl rysowania do zastosowania zmiany związane z wielkością, jednak wywołanie ** layoutIfNeeded() ** natychmiast stosuje te zmiany! Mały kod, większy efekt !! –

0

miałem kiedyś podobny problem (zawartość celi nie było dopasowanie komórka nawet z prawidłowym autoLayout). Błąd został spowodowany przez nie wywoływanie super.layoutSubviews() w overriden function layoutSubviews(), który był w klasie Cell.

Powiązane problemy