custom ios uicollectionview uicollectionviewlayout

ios - custom - UICollectionView se bloquea cuando se desplaza whist rotando(los atributos de diseño para el elemento suplementario en la ruta de índice cambian sin invalidar...)



uicollectionview layout (1)

¿Alguna idea de cómo resolver el hecho de que mi UICollectionView se cuelgue cuando se desplaza whist rotando?

Estoy usando el siguiente enfoque para desplazarse y girar por separado, y cada uno parece funcionar bien. Acabo de notar que cuando hago ambas cosas al mismo tiempo, puedo tener este colapso. Así que parece tener algo que ver con el hecho de que cuando giro el dispositivo y los nuevos atributos de diseño se calculan en prepareLayout, que el desplazamiento continuo desencadena "invalidateLayoutWithContext (invalidContext)" (ver a continuación).

Ideas? ¿Hay alguna forma de poner en espera las respuestas de desplazamiento (o ignorarlas) durante la rotación?

Enfoque de rotación En viewWillLayoutSubviews en el controlador de vista, invalido todo el diseño

self.cal.collectionViewLayout.invalidateLayout()

Enfoque de desplazamiento Para permitirme tener una vista decorativa "adhesiva" (encabezado), no invalido todo el diseño, ya que mata el rendimiento, pero hago lo siguiente. En la clase de diseño, anulo shouldInvalidateLayoutForBoundsChange

override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { let invalidContext : UICollectionViewLayoutInvalidationContext = self.invalidationContextForBoundsChange(newBounds) // Keep Header Sticky invalidContext.invalidateDecorationElementsOfKind(GCCalendarLayoutKind_Decorative1, atIndexPaths: [headerDecorativeIndexPath]) // Apply Invalidation self.invalidateLayoutWithContext(invalidContext) // Return normal super return (just in case of future IOS upgrades) return super.shouldInvalidateLayoutForBoundsChange(newBounds) }

Tenga en cuenta que estoy invalidando la Vista decorativa (encabezado), mientras que el error con el bloqueo se debe a que mis diseños de vista suplementarios son diferentes.

Error

2015-10-30 07: 14: 30.181 test3_collectionview [17086: 3102132] * Error de aserción en - [UICollectionViewData validateLayoutInRect:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.29.5/ UICollectionViewData.m: 408 2015-10-30 07: 14: 30.185 test3_collectionview [17086: 3102132] * Aplicación de finalización debido a la excepción no detectada ''NSInternalInconsistencyException'', razón: ''atributos de diseño para el elemento suplementario en la ruta del índice ({longitud = 2, ruta = 0 - 0}) cambiado desde la ruta del índice: ({longitud = 2, ruta = 0 - 0}); tipo de elemento: (Decorativo1); frame = (0 1085.5; 320 16); zIndex = 1; para indexar la ruta: ({longitud = 2, ruta = 0 - 0}); tipo de elemento: (Decorativo1); frame = (0 853.5; 320 16); zIndex = 1; sin invalidar el diseño ''*** Primera pila de llamadas de tiro:


No estoy seguro de que esto sea suficiente, pero probaría algo en esta línea (una vista de colección es una vista de desplazamiento):

import CoreGraphics class myController: UIViewController, UIScrollViewDelegate { var myScrollView = UIScrollView() override func viewDidLoad() { self.view.addSubview(myScrollView) } // This will capture rotation events override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { self.myScrollView.scrollEnabled = false coordinator.notifyWhenInteractionEndsUsingBlock( {_ in self.myScrollView.scrollEnabled = true} ) super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) } func scrollViewDidScroll(scrollView: UIScrollView) { // This will not ignore scroll but perhaps can help keeping things "tidy" and "performant" during rotation. Not sure if myScrollView.scrollEnabled == false { let offset = scrollView.contentOffset myScrollView.setContentOffset(offset, animated: false) } } }