22

我正在尝试滚动到集合视图中的特定项目,它似乎在大约 90% 的时间里正确发生。我基本上有一个集合视图,我通过自动布局更改其框架,然后我希望我的单元格是所有新框架的大小,所以我设置了一个新大小。当我在 scrollToItemAtIndexPath 上放置一个断点时,似乎它工作时项目大小已经生效,但它不起作用的时候,单元格仍然具有旧大小。如何在滚动之前确保 itemSize 已更改?

[weakSelf.view removeConstraints:@[weakSelf.verticalSpace, weakSelf.collectionViewBottomSpace, weakSelf.bottomLayoutTopCollectionView]];
[weakSelf.view addConstraints:@[weakSelf.collectionViewToTop, weakSelf.imageHeight, weakSelf.youLabelToTop]];
[UIView animateWithDuration:animated ? .5 : 0.0
                                      animations:^{
                                          [weakSelf.view layoutIfNeeded];
                                      }
                                      completion:^(BOOL finished) {
  UICollectionViewFlowLayout * layout = (UICollectionViewFlowLayout *)self.currentUserCollectionView.collectionViewLayout;

  layout.itemSize = weakSelf.currentUserCollectionView.frame.size;

  [weakSelf.currentUserCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:[self getSelectedIndex:selectItem] inSection:0]
                                         atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
                                                 animated:NO];
}];
4

2 回答 2

44

确保集合视图在滚动之前首先布置了它的子视图以及单元格的大小。我建议将您的滚动移动到您确定所有布局都已完成的地方,例如:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    NSIndexPath *indexPath = // compute some index path

    [self.collectionView scrollToItemAtIndexPath:indexPath
                                atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
                                        animated:YES];
}
于 2013-11-19T23:24:26.057 回答
25

另一种选择是在打电话layoutIfNeeded之前UICollectionView先打电话scrollToItemAtIndexPath。这样您就不会在每次布置父视图的子视图时都执行滚动操作。

于 2015-02-26T20:22:13.170 回答