ios uiscrollview uinavigationcontroller crash uicollectionview

ios - UICollectionView llamando a scrollViewDidScroll: cuando se saca de la pila de navegación



uiscrollview uinavigationcontroller (3)

Establecer self.automaticallyAdjustsScrollViewInsets = NO; dentro de su controlador de vista.

Tuve un problema similar a este, y descubrí que al navegar fuera de la página, el contentOffset cambiaba en 20 cada vez.

Descubrí que establecer esta propiedad dentro de mi controlador de vista detuvo este cambio y, por scrollViewDidScroll tanto, ya no se llamaba a scrollViewDidScroll . Resulta que el controlador de vista ajusta automáticamente las inserciones de contenido para los cambios en la barra de estado, la barra de navegación, etc., incluso cuando se aleja.

Creo que esta es una mejor solución y una explicación adecuada de por qué se llamó al método de desplazamiento.

Tengo un controlador de navegación, su controlador de vista raíz es de tipo CollectionViewControllerA . Al seleccionar un elemento, tengo una animación de desaparición y expansión seguida de una llamada para insertar un segundo controlador de vista de tipo CollectionVewControllerB en la pila:

CollectionViewControllerB *b = ... // construction of the view controller to be pushed [UIView animateWithDuration:.3 animations:^{ self.collectionView.transform = CGAffineTransformMakeScale(1.5, 1.5); self.collectionView.alpha = 0; } completion:^(BOOL s){ [self.navigationController pushViewController:b animated:NO]; }];

Me pongo el controlador de vista de una manera similar

[UIView animateWithDuration:.3 animations:^{ self.collectionView.transform = CGAffineTransformMakeScale(.3, .3); self.collectionView.alpha = 0; } completion:^(BOOL s){ [self.navigationController popViewControllerAnimated:NO]; }];

El problema aquí es que la aplicación se bloquea al abrir el controlador de vista. Razón:

*** -[CollectionViewControllerB scrollViewDidScroll:]: message sent to deallocated instance

Entiendo que el problema se debe a que el controlador de vista scrollViewDidScroll: se destruye, pero ¿por qué se llama a scrollViewDidScroll: en primer lugar? Nada cambia el contentOffset del collectionView en el código, y tampoco hay interacción del usuario. ¿A menos que cambiar la propiedad de transform también active el método para ser llamado?

CollectionViewControllerB implementa scrollViewDidScroll: porque necesito deshabilitar el desplazamiento vertical.

Mientras tanto, tengo un truco muy desordenado para evitar el bloqueo, es decir, antes de la animación, agrego

self.collectionView.delegate = nil;

Esto evita que el método sea llamado. Pero tiene que haber una mejor manera.

¿Alguien puede arrojar algo de luz sobre por scrollViewDidScroll: se llama scrollViewDidScroll: y cómo se puede detener?


Parece que la única manera de resolver el problema es lo que ya he hecho ... establecer el delegado en nulo antes de la animación.

self.collectionView.delegate = nil;

Esperemos que esto ayude a alguien más en el futuro.


Puedes probar esto en tu controlador.

[self setEdgesForExtendedLayout:UIRectEdgeNone];

Espero que esto te ayude.