Сохранение UICollectionView contentOffset при возврате из представленного контроллера представления
У меня есть подкласс UIViewController, который содержит UICollectionView. Выбор ячейки представляет новый контроллер представления. Когда я возвращаюсь к первому контроллеру представления, contentOffset представления коллекции сбрасывается к CGPointZero.
Из моих исследований это кажется стандартным поведением.
Я могу сбросить contentOffset, добавив личное свойство в мой подкласс контроллера представления, сохранив contentOffset в viewWillDissapear
метод и сброс его в представлении коллекции в viewWillAppear
метод.
Я хотел бы знать, хотя, есть ли другой способ предотвратить смещение содержимого представления прокрутки от сброса во-первых (устраняя необходимость в дополнительном свойстве)?
Я нацеливаюсь на iOS7.
Контроллер второго вида представлен так:
[self presentViewController:secondVC animated:YES completion:nil];
И уволен, как это (во втором представлении контроллера):
-(void) dismiss
{
[self dismissViewControllerAnimated:YES completion:nil];
}
Редактировать: После дальнейшего изучения кажется, что сброс contentOffset не является поведением по умолчанию. Я еще не понял, почему это происходит в моем приложении. Я представляю, как показано в коде выше.
3 ответа
Есть 2 варианта. Если ваше приложение работает с UINavigationController, оно должно сохранять последнюю доступную ячейку, не будучи уверенным в том, как вы работали. Если нет, вы всегда можете создать уведомление и в тот момент, когда вы вернетесь к предыдущему экрану, отправить обновление UICollectionView или все, что у вас есть, и прокрутить до нужной позиции. Имейте в виду, жизненный цикл UIViewController и как он будет выглядеть до обновления пользовательского интерфейса.
Вы можете создать объект CGPoint в AppDelegate. Затем вы можете установить это значение для ваших объектов CollectionView contentOffset, пока оно присутствует, и отклонить его;
[self presentViewController:secondVC animated:YES completion:{
appDelegate.tempContentValue = _collectionView.contentOffset;
}];
[self dismissViewControllerAnimated:YES completion:{
UIViewController *first = [UIViewController alloc] init];
[first.collectionView setContentOffset:appDelegate.tempContentValue animated:YES];
}];
@property (nonatomic,assign) CGPoint newContentOffset;
Затем при переходе к другому представлению / представить другой вид
self.newContentOffset = self.collectionView.contentOffset;
По мнению WillAppear
[self.collectionView reloadData];
if (self.newContentOffset) {
[self performSelector:@selector(setContentOffset) withObject:nil afterDelay:0.1];
}
-(void)setContentOffset {
[self.collectionView setContentOffset:self.newContentOffset];
}
При применении этого будет небольшой рывок. Но если все в порядке, вы можете пойти дальше с этим методом