Сохранение 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];

   }

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

Другие вопросы по тегам