Подтвердить что ты не робот

Вызов UICollectionView scrollViewDidScroll: при нажатии из стека навигации

У меня есть контроллер навигации, его контроллер корневого представления имеет тип 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: и как его можно остановить?

4b9b3361

Ответ 1

Кажется, что единственный способ решить проблему - это то, что я уже сделал... настройка делегата на нуль перед анимацией.

self.collectionView.delegate = nil;

Надеюсь, это поможет кому-то еще в будущем.

Ответ 2

Установите self.automaticallyAdjustsScrollViewInsets = NO; внутри вашего контроллера вида.

У меня была проблема, сходная с этим, и выяснилось, что при навигации по странице страница contentOffset менялась на 20 каждый раз.

Я обнаружил, что установка этого свойства внутри моего контроллера просмотра остановила это изменение, и поэтому scrollViewDidScroll больше не вызывался. Выключает контроллер вида, который автоматически настраивает вставки содержимого для изменений в строке состояния, панели навигации и т.д. Даже когда вы перемещаетесь.

Я думаю, что это лучшее решение и правильное объяснение того, почему вызывался метод прокрутки.

Ответ 3

Вы можете попробовать это в своем контроллере.

[self setEdgesForExtendedLayout:UIRectEdgeNone];

Надеюсь, это поможет вам.