4

我有一个包含 UICollectionView 的 UIViewController 子类。选择一个单元格会显示一个新的视图控制器。当我返回到第一个视图控制器时,集合视图的 contentOffset 被重置为 CGPointZero。

根据我的研究,这似乎是标准行为。

我可以通过向我的视图控制器子类添加私有属性来重置 contentOffset,将 contentOffset 保存在viewWillDissapear方法中并在方法中的集合视图上重置它viewWillAppear

不过我想知道,是否有另一种方法可以防止滚动视图内容偏移量被重置(消除对额外属性的需要)?

我的目标是iOS7。

第二个视图控制器如下所示:

[self presentViewController:secondVC animated:YES completion:nil];

并像这样被解雇(在第二个视图控制器中):

-(void) dismiss
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

编辑:经过进一步调查,似乎重置 contentOffset 不是默认行为。我还没有弄清楚为什么它会在我的应用程序中发生。我正在呈现就像上面代码中显示的那样。

4

3 回答 3

0

有 2 个选项。如果您的应用程序使用 UINavigationController,它应该保留最后访问的单元格,不确定您是如何使用的。如果没有,您始终可以创建一个通知,并在您返回上一个屏幕的那一刻,发送 UICollectionView 或您拥有的任何内容的更新并滚动到正确的位置。请记住,UIViewController 生命周期以及它在更新用户界面之前将如何出现。

于 2014-07-18T15:36:02.537 回答
0

您可以在 AppDelegate 中创建一个 CGPoint 对象。然后,您可以在存在时将该值设置为您的 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];
}];
于 2014-07-22T14:57:00.260 回答
0
   @property (nonatomic,assign) CGPoint newContentOffset;

然后当您导航到另一个视图/呈现另一个视图时

  self.newContentOffset = self.collectionView.contentOffset;

在视图中会出现

  [self.collectionView reloadData];

   if (self.newContentOffset) {
        [self performSelector:@selector(setContentOffset) withObject:nil afterDelay:0.1];
   }


  -(void)setContentOffset {
        [self.collectionView setContentOffset:self.newContentOffset];

   }

应用这个时会有一个小混蛋。但如果没问题,您可以继续使用此方法

于 2016-05-04T13:11:18.557 回答