【发布时间】:2013-06-19 10:26:42
【问题描述】:
我有一个UICollectionView 和两个UICollectionViewFlowLayout 的子类。当一个单元格被选中时,我调用setCollectionViewLayout:animated: 在布局之间切换。过渡完成后,选中的单元格居中即可。
是否可以在不实际选中单元格的情况下完成相同的居中行为?我试过用不同的方法打电话给setContentOffset:animated:,但没有成功。或者,我可以为要显示的布局指定一个自定义的contentOffset 吗?
更清楚地说,我希望在不修改单元格的selected 属性的情况下拥有这样的东西:
编辑 #1
这是我已经拥有的:
[self.collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
[self.collectionView setCollectionViewLayout:layout animated:YES];
看起来不错:https://www.dropbox.com/s/9u6cnwwdbe9vss0/17249646-0.mov
但是如果我跳过selectItemAtIndexPath:
[self.collectionView setCollectionViewLayout:layout animated:YES];
[self.collectionView scrollRectToVisible:targetFrame animated:YES];
这不是很好(一种挥舞的动画):https://www.dropbox.com/s/s3u2eqq16tmex1v/17249646-1.mov
【问题讨论】:
-
是不是第二种情况下单元格最终过高的问题?我想到了几件事。首先,您可能会受到这个issue with
contentOffset的影响。里面的建议可能会对你有所帮助。其次,您是否验证了传递给scrollRectToVisible的帧是否实际可见?了解这一点可能有助于缩小解决方案的范围。 -
如果您查看第二个视频,您可以看到 contentOffset 有点“摇摆”。我上下移动,直到它到达它的最终位置。同时,在第一个视频中只有一个直线运动。问题是,我无法重现!
-
我注意到两个视频中的最终位置不同。因此,您传递给 scrollRectToVisible 的框架可能不正确。我建议修改那个框架,直到你得到相同的最终位置,看看是否有帮助。
-
另外,您能否检查
contentSize、contentOffset的最终值和单元格的框架,以验证两个场景之间的所有值是否匹配? -
但它不应该与我指定的任何矩形一起使用吗?我的意思是,不限于使用完全居中的矩形。我猜
setCollectionViewLayout和scrollRectToVisible的动画块不知何故发生了冲突,这导致了挥动的东西。你怎么看?
标签: ios objective-c cocoa-touch uicollectionview uicollectionviewlayout