UICollectionView scrollToItemAtIndexPath

Posted

技术标签:

【中文标题】UICollectionView scrollToItemAtIndexPath【英文标题】: 【发布时间】:2013-11-06 15:34:29 【问题描述】:

我正在尝试滚动到集合视图中的特定项目,并且它似乎在大约 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];
];

【问题讨论】:

问题是什么?您刚刚在此处粘贴了代码。 抱歉...按得太快了 别担心,顺便说一句,不是我的反对票 :) 当你改变collection view的布局约束时,你是在调用invalidateLayout吗? 我调用 layoutIfNeeded。我更新了代码。 【参考方案1】:

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

- (void)viewDidLayoutSubviews

    [super viewDidLayoutSubviews];
    NSIndexPath *indexPath = // compute some index path

    [self.collectionView scrollToItemAtIndexPath:indexPath
                                atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
                                        animated:YES];

【讨论】:

scrollToItemAtIndexPath in viewDidLayoutSubviews 方法可以产生无限滚动,因为每次滚动后都会调用 viewDidLayoutSubviews 这里的 indexPath 应该是什么? NSIndexPath *indexPath = .. 一个例子。 @KayCee 您只需要跟踪您想要滚动到的位置。例如 NSIndexPath *indexPath = [NSIndexPath indexPathForRow:itemNumber inSection:0];其中 itemNumber 是一个 NSInteger 被设置在你的代码的其他地方。希望这会有所帮助!【参考方案2】:

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

【讨论】:

完美的解决方案!非常简单便携。

以上是关于UICollectionView scrollToItemAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

Cypress web自动化30-操作窗口滚动条(scrollTo)

如何使用平滑效果的 window.scrollTo() [关闭]

为啥 scrollTo() 方法不适用于 iframe?

如何在 window.scrollTo() 之外滚动页面

如何使用 JQuery $.scrollTo() 函数滚动窗口

有啥方法可以平滑地为 window.scrollTo(0, 1) 设置动画?