scrollToItemAtIndexPath销毁UICollectionViewCell布局

时间:2014-11-15 15:24:31

标签: ios objective-c iphone cocoa-touch uicollectionview

我正在创建一个水平滚动的分页UICollectionView,其单元格与集合视图一样大,因此一次只显示一个单元格。我还希望在首次出现集合视图时首先显示最后一项,以便从左侧显示其他项目,而不是从右侧显示下一项目的默认项目。

为此,我按照this answer的建议在我的视图控制器scrollToItemAtIndexPath:中调用viewDidLayoutSubviews。如果我在viewWillAppear或scrollToItemAtIndexPath中调用viewDidLoad,则集合视图不会滚动到最后一项。

但是,此调用会破坏我的集合视图单元格的布局。例如,如果我不调用scrollToItemAtIndexPath:,则集合视图(下面的白色区域)看起来像左侧 - 正确布局但显示第一个项目。如果我调用scrollToItemAtIndexPath:,集合视图最初会显示最后一项,但布局会像右边一样混乱(日期甚至不再显示)。

enter image description here

我做错了什么?

更多信息:

  • 我在iOS 7和iOS 8中都看到了这个错误。
  • 我在Xcode 6.1中使用大小类。

viewDidLayoutSubviews的代码:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:self.unit.readings.count - 1 inSection:0];
    [self.readingCollectionView scrollToItemAtIndexPath:lastIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
}

2 个答案:

答案 0 :(得分:2)

每当我遇到这个问题并且我有一个恒定大小的单元格时,我只是手动设置了contentOffset并忽略了collectionView方法。

self.collectionView.contentOffset = (CGPoint){
  .x = self.collectionView.contentSize.width - cell.width,
  .y = 0,
};

答案 1 :(得分:2)

我在viewWillLayoutSubviews中添加了以下内容(也适用于viewDidLayoutSubviews):

[self.readingCollectionView scrollToItemAtIndexPath:lastIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
[self.readingCollectionView reloadData];

然而,UI问题仍然存在:当视图控制器出现时,它会显示第一个项目,然后立即刷新以显示最后一个项目。

为了解决这个看似无法解决的问题,我改为破解了用户界面:显示一个"正在加载"视图控制器出现之前的标签,并在viewDidAppear中显示集合视图。