Diseño de UICollectionViewCell emite iOS9

Desde mi traslado al nuevo iOS9 y Xcode 7, he tropezado con un problema con uno de los UICollectionView en mi aplicación.

Al parecer, UICollectionView no parece actualizar el layout y restricciones de UICollectionViewCell correctamente, solo hasta que se reutilice.

Las imágenes hablan mejor que las palabras, así es como se ve cuando se ve por primera vez el UIViewController : introduzca la descripción de la imagen aquí

Sin embargo, este no es el layout correcto, y fácilmente cuando UICollectionView el UICollectionView horizontalmente hacia la izquierda, obtengo el layout correcto de las celdas recién aparecidas: introduzca la descripción de la imagen aquí

Cuando retrocedo, las celdas viejas que no eran correctas, ahora están reutilizadas y se ven bien.

Ahora, como era antes de actualizar a iOS9 y Xcode 7, mi efecto deseado es que las celdas tengan el layout correcto incluso cuando aparecen por primera vez.

Para su comodidad, aquí hay más detalles sobre cómo se configura UICollectionView y sus restricciones en el XIB: introduzca la descripción de la imagen aquí

En el código, es bastante estándar:

 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell : MatchmakersCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionCell", forIndexPath: indexPath) as! MatchmakersCollectionViewCell cell.imageView.backgroundColor = UIColor.lightGrayColor() cell.bottomName.text = "StackOverflow" return cell } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return self.matchmakers.count } func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 } 

Y cada vez que actualicé el origen de datos (self.matchmakers), llamé a self.collectionView.reloadData()

Una última cosa que noté fue muy extraño, al depurar con Xcode la jerarquía de vista de debugging, UICollectionViewCell nunca presentó las subvistas correctamente y solo me dio una UIView pnetworkingeterminada en su lugar: introduzca la descripción de la imagen aquí

Para resolver este problema:

  1. Cree su UICollectionViewCell personalizado utilizando files Nib (.xib) .

  2. En su UICollectionViewCell personalizado, anule el método didMoveToSuperView () para agregar esto

    self.setNeedLayout ()

    self.layoutIfNeeded ()

3. En su método UIViewController viewDidLoad ()

self.collectionView.registerNib (UINib (nibName: "yourNibName", bundle: nil), forCellWithReuseIdentifier: "Cell")

——– actualización 20150923

solo necesita el paso 2, anule el método didMoveToSuperView para agregar

self.setNeedLayout ()

self.layoutIfNeeded ()

en su class UICollectionViewCell personalizada.

Gracias @macayer

No tuve que crear mi propio XIB para mi celda, siempre que tenga mi celda personalizada y la haya vinculado a mi guión gráfico, acabo de agregar esa línea (MyCustomCollectionViewCell.m):

 - (void)didMoveToSuperview{ [super didMoveToSuperview]; [self setNeedsLayout]; [self layoutIfNeeded]; } 

Tuve el mismo error en iOS9 también. Quizás hayas descubierto que todo está bien después de volver a cargar la vista de la colección. Entonces mi solución: configure un timer para que iOS9 recargue las celdas.

 if #available(iOS 9, *) { self.refreshTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("refreshDataTimer"), userInfo: nil, repeats: true) } 

Y vuelva a cargarlos:

 func refreshDataTimer(){ self.collectionView?.reloadData() } 

Aunque esta solución es un poco estúpida pero funciona en pocas líneas.

o puede recargar cada celda:

 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { .... self.collectionView?.reloadItemsAtIndexPaths([indexPath]) return cell } 

Pero es ineficiente

Tuve el mismo error en iOS9. Me gustaría centrar x y centrar la image en UICollectionView Cell. No funciona, pero ahora agregué en el guión gráfico Align Top y Align Leading NSLayoutConstraint , luego agregué salidas NSLayoutConstraint y adentro

(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath . Estoy cambiando NSLayoutConstraint según la resolución.

Estoy bastante seguro de que se trata de un error de iOS9. En lugar de configurar la UI UICollectionViewCell y las restricciones en el UICollectionView en el Storyboard, creé su propio XIB. Luego agregado al UIViewController :

 self.collectionView.registerNib(UINib(nibName: "MatchmakersCollectionViewCell", bundle: NSBundle.mainBundle()), forCellWithReuseIdentifier: "CollectionCell") 

Ahora funciona bien.

Tuve una parte del problema que el OP describió …

Una última cosa que había notado, que era muy extraño, al depurar con Xcode la jerarquía de vista de debugging, UICollectionViewCell nunca presentó las subvistas correctamente y simplemente me dio una UIView pnetworkingeterminada en su lugar

Pasé años golpeando mi cabeza contra una panetworking tratando de averiguar qué sucedía, ninguna de las respuestas sugeridas marcó la diferencia. Al final, terminé borrando todas las restricciones en mis celdas XIB y volviéndolos a agregar y solucionó el problema. Creo que las restricciones deben haberse corrompido en algún momento.

Espero que pueda ayudar a alguien.

En mi caso, desactivar las classs de tamaño en el file .xib hizo el truco.

Aquí está el código apropiado Swift 2.0 necesario para resolver este problema en Xcode 7. Tenga en count que el código correcto es 'setNeedsLayout' y no 'SetNeedLayout' como se indicó anteriormente. Asegúrese de llamarlo en el file UICollectionViewCell.

  override func didMoveToSuperview() { self.setNeedsLayout() self.layoutIfNeeded() }