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() [关闭]