【问题标题】:Preserving UICollectionView contentOffset when returning from a presented view controller从呈现的视图控制器返回时保留 UICollectionView contentOffset
【发布时间】:2014-09-09 19:30:07
【问题描述】:

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

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

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

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

我的目标是 iOS7。

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

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

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

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

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

【问题讨论】:

  • 你为什么要另一种方法,我觉得这个方法很好用
  • 一方面我觉得这种方法很乱。另一方面,当 contentOffset 重置为 0 时,之前可见的单元格将被重用。我正在从 url 下载图像,所以当我返回视图并重置 contentOffset 时,我需要重新下载图像。一旦我有适当的缓存,这可能不是问题,但我仍然希望这不会发生。
  • 我在我的应用程序 (iOS 7.1) 中看不到这种行为。当我从模态演示返回时,内容偏移量不会改变。您是使用连接到单元格的 segue 还是在 didSelectItemAtIndexPath 中进行手动演示?如果是后者,你在那个方法中有什么代码。
  • @rdelmar:你是对的。我创建了一个测试应用程序并看到了与您相同的行为。我通过 didSelectItemAtIndexPath 方法进行演示。我尝试更新我的问题。
  • 当你带着collection view回到控制器时你是否在重新加载数据?

标签: ios uiscrollview uicollectionview contentoffset


【解决方案1】:

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

【讨论】:

  • 在这种情况下我没有使用 UINavigationController,因为我以模态方式呈现第二个视图控制器。我仍然可以访问选定的单元格,但这将如何为我提供集合视图的确切内容偏移量?通知无济于事,我已经可以使用 viewWillAppear 方法来设置我的 contentOffset。问题是试图阻止我的 contentOffset 首先被重置。不过感谢您的想法。
【解决方案2】:

您可以在 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];
}];

【讨论】:

  • 1-A UIViewController 没有 collectionView 属性,因此不会编译 2-将其替换为具有 collectionView 的子类,当您实例化控制器时,dismiss 方法中的代码不会执行任何操作然后几乎立即发布 3-appDelegate 不应用于存储随机 VC 的 contentOffsets。 4-问题是如何首先防止偏移量被重置。不要试图粗鲁,只是试图提供一些有用的反馈。感谢您提供帮助。
【解决方案3】:
   @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];

   }

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

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多