Ответ 1
Кажется, что единственный способ решить проблему - это то, что я уже сделал... настройка делегата на нуль перед анимацией.
self.collectionView.delegate = nil;
Надеюсь, это поможет кому-то еще в будущем.
У меня есть контроллер навигации, его контроллер корневого представления имеет тип CollectionViewControllerA
. После выбора элемента у меня появляется постепенное уменьшение и расширение анимации, за которым следует вызов, чтобы вставить второй контроллер представления типа CollectionVewControllerB
в стек:
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];
}];
Я выхожу на контроллер вида аналогичным образом
[UIView animateWithDuration:.3
animations:^{
self.collectionView.transform = CGAffineTransformMakeScale(.3, .3);
self.collectionView.alpha = 0;
}
completion:^(BOOL s){
[self.navigationController popViewControllerAnimated:NO];
}];
Проблема заключается в том, что приложение вылетает при появлении контроллера вида. Причина:
*** -[CollectionViewControllerB scrollViewDidScroll:]: message sent to deallocated instance
Я понимаю, что проблема в том, что контроллер popped view уничтожен, но почему scrollViewDidScroll:
вызывается в первую очередь? Ничто не меняет contentOffset
кода collectionView
в коде, и нет никакого взаимодействия с пользователем. Если изменение свойства transform
также вызывает метод для вызова?
CollectionViewControllerB
реализует scrollViewDidScroll:
, потому что мне нужно отключить вертикальную прокрутку.
Между тем у меня очень очень грязный взломать, чтобы предотвратить сбой, то есть до анимации, я добавляю
self.collectionView.delegate = nil;
Это останавливает вызов метода. Но должен быть лучший способ.
Может ли кто-нибудь пролить свет на то, почему вызывается scrollViewDidScroll:
и как его можно остановить?
Кажется, что единственный способ решить проблему - это то, что я уже сделал... настройка делегата на нуль перед анимацией.
self.collectionView.delegate = nil;
Надеюсь, это поможет кому-то еще в будущем.
Установите self.automaticallyAdjustsScrollViewInsets = NO;
внутри вашего контроллера вида.
У меня была проблема, сходная с этим, и выяснилось, что при навигации по странице страница contentOffset
менялась на 20 каждый раз.
Я обнаружил, что установка этого свойства внутри моего контроллера просмотра остановила это изменение, и поэтому scrollViewDidScroll
больше не вызывался. Выключает контроллер вида, который автоматически настраивает вставки содержимого для изменений в строке состояния, панели навигации и т.д. Даже когда вы перемещаетесь.
Я думаю, что это лучшее решение и правильное объяснение того, почему вызывался метод прокрутки.
Вы можете попробовать это в своем контроллере.
[self setEdgesForExtendedLayout:UIRectEdgeNone];
Надеюсь, это поможет вам.