【问题标题】:scrollToItemAtIndexPath before the view is shown the first time在第一次显示视图之前的 scrollToItemAtIndexPath
【发布时间】: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


【解决方案1】:

约束在viewDidAppearlayoutSubviews 被最后一次调用时开始起作用。到那时已经太晚了。

你可以尝试从 UICollectionView 继承你自己的类,看看它的layoutSubviews 是否有正确的约束,然后从那里调用scrollToIndex

如果失败,您可以通过在viewDidLoad 中设置帧大小并调用滚动索引来作弊。 (这个有点复杂)-

【讨论】:

    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多