使用UICollectionView scrollToItemAtIndexPath返回上一个选定的单元格

时间:2013-12-07 00:52:39

标签: ios objective-c uicollectionview

我有UICollectionView供用户从网格中选择图像。选择单元格后,将释放视图控制器,包括UICollectionView。

我想记住用户上次使用UICollectionView的位置,并在再次加载视图控制器时自动滚动到该位置。

我遇到的问题是什么时候可以做到。我假设我需要等到UICollectionView完全加载后再执行scrollToItemAtIndexPath:atScrollPosition:animated:

确定视图控制器和UICollectionView何时完全布局的首选方法是什么?

1 个答案:

答案 0 :(得分:1)

我花了一些时间探索解决方案。 @Leo,我无法滚动viewDidLoad。但是,我能够获得良好的结果,跟踪视图生命周期的状态。

我创建了一个常量来记住内容偏移量。我使用了一个常量,所以它会在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
}

当我的视图消失时,重要的部分是保存内容偏移量。在我想要的应用程序的启动和不在偏好中保存它的原因之间不会记住常量。

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