【发布时间】:2015-10-13 20:11:29
【问题描述】:
我有一个UIView,我在其中添加了一个UICollectionView。现在这个视图显示在应用启动时。同时,我正在滚动到收藏视图中的某个位置。因此我使用scrollToItemAtIndexPath。现在的问题是它滚动到错误的位置,因为集合视图在开始时的大小错误:如果您在 iOS 7 上以横向方向启动 iPad,尽管集合视图处于横向状态,但集合视图始终采用 768 作为宽度。
如何在用户不注意的情况下滚动到某个位置?我可以在视图层次结构中的哪个位置调用它?
viewWillAppear: 框架尚未设置viewDidAppear: 在用户没有注意到的情况下是不可能的layoutSubviews: 这被多次调用,我只在启动时和用户按下时才需要它一个按钮
我也尝试使用layoutIfNeeded,但这对我的边缘案例(iOS 7、iPad、启动时的横向)没有帮助。
【问题讨论】:
-
约束在最后一次调用 viewDidAppear 和 layoutSubviews 的时候开始起作用。到那个时候已经太晚了。您可以尝试从
UICollectionView继承您自己的类,看看它的layoutSubviews是否有正确的约束并从那里调用scrollToIndex。如果失败,您可以通过在 viewDidLoad 中设置帧大小并调用滚动来索引来作弊。 (这个有点复杂) -
@iosDev82:我尝试了您描述的第一种方式,方法是使用布尔值,以便只调用一次。另外我检查宽度是否大于零。使用这种方法,集合视图根本不显示,我在控制台中得到以下输出:流布局中不支持负或零大小。如果没有在集合视图的
layoutSubviews中调用scrollToItemAtIndexPath,一切都会正常显示(滚动位置除外)。我应该如何检查正确的约束? -
现在我在致电
[super layoutSubviews];之后执行此操作,它似乎适用于第一次测试。此外,我删除了动画。不过,我会再测试一下。这是 Apple 的预期行为还是 iOS 7 中的错误? -
我认为这是 Apple 的预期行为,它真的很糟糕。我认为约束应该由
viewDidLoad或至少viewWillAppear解决。让我们知道您是否通过了所有测试。 :) -
您可以发表您的评论作为答案。我不得不重组一些其他的电话(需要
layoutIfNeeded),但现在它应该可以工作了。我有一个similar question。也许你可以看看它。谢谢!
标签: ios ios7 scroll uicollectionview