ios - 使用 UICollectionView scrollToItemAtIndexPath 返回到最后选定的单元格

标签 ios objective-c uicollectionview

我有 UICollectionView 供用户从网格中选择图像。一旦选择了一个单元格, View Controller 就会被释放,包括 UICollectionView。

我想记住用户上次使用 UICollectionView 时的位置,并在再次加载 View Controller 时自动滚动到该位置。

我遇到的问题是何时可以完成此操作。我假设我需要等到 UICollectionView 完全加载后再执行 scrollToItemAtIndexPath:atScrollPosition:animated:

确定 View Controller 和 UICollectionView 何时完全布局的首选方法是什么?

最佳答案

我花了一些时间探索解决方案。 @Leo,我无法在 viewDidLoad 中滚动。但是,我在跟踪 View 生命周期的状态方面取得了良好的结果。

我创建了一个常量来记住内容偏移量。我使用了一个常量,这样它就可以在 VC 的加载之间保留它的值。我还创建了一个属性来标记何时可以滚动:

static CGPoint kLastContentOffset;
@property (nonatomic) BOOL autoScroll;
@property (weak, nonatomic) IBOutlet UICollectionView *collection;

我使用的生命周期代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.autoScroll = NO; // before CollectionView laid out
}

- (void)viewDidDisappear:(BOOL)animated
{
    kLastContentOffset = self.collection.contentOffset;
    [super viewDidDisappear:animated];
}

- (void)viewDidLayoutSubviews
{
    if (self.autoScroll) { // after CollectionView laid out
        self.autoScroll = NO; // don't autoScroll this instantiation of the VC again
    if (kLastContentOffset.y) {
        [self.collection setContentOffset:kLastContentOffset];
    }
}

在 collectionView 布局期间,我设置了标志,指示下一个 viewDidLayoutSubviews 应自动滚动:

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView
{
    self.autoScroll = YES;
    // return count here
}

重要的部分是当我的 View 消失时保存内容偏移量。在启动我想要的应用程序和不将其保存在首选项中的原因之间,不会记住该常量。

似乎必须有一个更优雅的解决方案,但这效果很好。

关于ios - 使用 UICollectionView scrollToItemAtIndexPath 返回到最后选定的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20436155/

相关文章:

iOS #define 或全局字符串的静态常量

ios - 将 NSArray 转换为 NSSortDescriptor

Objective-C 语法问题

ios - 自定义 UICollectionViewLayout 为不存在的索引路径传递布局属性

iphone - UICollectionView布局

ios - swift 强制将 objective-c int 分配为 Int32 然后崩溃

android - 从 Rails 应用程序向 iOS、Android、BlackBerry 发送通知

ios - 如何在选择和取消选择单元格时仅保留数组中的不同元素?

html - 如何在 iOS 应用程序上全屏启动相机 View ?

ios - 在 didSelectItemAt 中实现委托(delegate)