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)
}
}
}