scrollToItemAtIndexPath

scrollToItemAtIndexPath

我正在创建一个分页的UICollectionView,它可以水平滚动,并且其单元格与集合视图一样大,因此一次仅显示一个单元格。我还想在集合视图首次出现时首先显示最后一个项目,以便其他项目从左侧显示,而不是默认的位置(默认情况下是从右侧显示下一个项目)。

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

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

我究竟做错了什么?

更多信息:

  • 我在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];
    }
    

    最佳答案

    每当遇到此问题且单元格大小恒定时,我都通过手动设置contentOffset并忽略collectionView方法来解决此问题。

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

    08-26 12:41