【问题标题】:UICollectionView Compositional Layout - items size not updated properly on iPad rotationUICollectionView 组合布局 - iPad 旋转时项目大小未正确更新
【发布时间】:2022-01-17 18:12:54
【问题描述】:

我有一个目前无法解决的问题,即我正在尝试根据 iPad 位置在集合视图中设置不同数量的列(集合应在设备旋转时更新)

目前,(取决于设备在启动时的定位方式)第一次旋转项目的宽度计算不正确:

iPad screen

如果有人可以提供帮助并指出问题所在,那就太好了。 这个项目的代码在我的 GitHub 上:https://github.com/ceboolion/compositionalLayout

感谢您的帮助。

【问题讨论】:

  • 如果我理解正确,当 iPad 处于横向时,列数应该增加,当它是纵向时,列数会减少,但每个单元格的大小是一样的 - 这是你想要的吗?
  • @ShawnFrank - 大小应调整以适应边界(宽度) - 纵向 3 列,横向 4

标签: ios swift uicollectionview autolayout


【解决方案1】:

我给你的 UICollectionView 设置了橙色背景,然后运行你的代码,得到了类似的结果:

我注意到了一些事情

  1. 由此我可以得出结论,UICollectionView 似乎已设置好并且在旋转时运行良好,可能是由于自动布局,所以我觉得问题更多与布局代码有关。
  2. 我还注意到,当您开始滚动时,视图会自行修复为您想要的内容
  3. 最后,我在您的func relayoutCollectionView(with size: CGSize) 函数中添加了一行代码,以查看您想要更新布局计算和列时的尺寸
func relayoutCollectionView(with size: CGSize) {
    collectionView.collectionViewLayout.shouldInvalidateLayout(forBoundsChange: CGRect(x: 0,
                                                                                       y: 0,
                                                                                       width: size.width,
                                                                                       height: size.height))
    collectionView.setCollectionViewLayout(createFlowLayout(),
                                           animated: true,
                                           completion: nil)
    
    collectionView.collectionViewLayout.invalidateLayout()
    
    // I added this line
    print("Collection View Width: \(collectionView.frame.size.width), Collection View Height: \(collectionView.frame.size.height)")
}

当我从纵向转到横向时,打印的输出是Collection View Width: 810.0, Collection View Height: 1080.0,这似乎不正确。

因此,我认为现在调用 invalidateLayout 以获得正确的计算还为时过早。

当我从 UIViewController 执行类似操作时,我会从 viewWillLayoutSubviews() 调用 invalidateLayout()

在您的情况下,我尝试和工作的是在您的 class CollectionView: UIView 中添加类似的 override func layoutSubviews()

    override func layoutSubviews() {
        super.layoutSubviews()
        collectionView.collectionViewLayout.invalidateLayout()
    }

我从您的func relayoutCollectionView 中删除了relayoutCollectionView

现在它似乎也是第一次工作,尽管我仍然无法解释为什么除了第一次之外你的当前工作每隔一次。

【讨论】:

  • 谢谢肖恩! - 确实在这里覆盖了 layoutSubviews 并使 collectionViewLayout 无效,这有助于在我旋转 iPad 时立即获得所需的布局。
  • 很高兴帮助@Tzebulion - 如果您觉得这对您有用,请考虑将其标记为答案
【解决方案2】:

正如最佳答案所说,滚动收集后它将旋转到错误的布局。 我尝试将动画设置为false,它可以工作! 但我无法解释为什么。

    collectionView.setCollectionViewLayout(createFlowLayout(), animated: false, completion: nil)

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 2021-12-12
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多