5

在 iPad 上使用多任务测试我的应用程序并更改应用程序上的应用程序大小时,需要调整集合视图单元格的大小,否则它们不适合视图窗口。

我采取了一些措施,例如

  • 改变细胞大小的检测装置
  • 测量视图大小以确保单元格适合窗口
  • 如果用户更改设备方向,则添加观察者

这一切都很好,但是在使用多任务处理或返回全屏应用程序时实际更改窗口大小时,单元格大小不会改变并且看起来不合适。这直到通过切换方向或切换视图控制器强制viewWillLoadviewDidLoad再次执行。

view.frame那么,如果尺寸发生变化,我该如何设置通知呢?

4

3 回答 3

12

我认为要覆盖的正确功能是viewWillTransition(to:, with:). 每当容器大小即将改变时调用它。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    self.collectionView?.collectionViewLayout.invalidateLayout()
}
于 2017-02-14T17:21:22.297 回答
4

我认为您将问题复杂化了,只需使用以下内容,因此当设备旋转或调整大小时,集合视图也会相应更改。

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    guard let collectionLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else {
        return
    }

    if UIApplication.shared.statusBarOrientation == UIInterfaceOrientation.landscapeLeft ||
        UIApplication.shared.statusBarOrientation == UIInterfaceOrientation.landscapeRight {
        //here you can do the logic for the cell size if phone is in landscape
    } else {
        //logic if not landscape
    }

    collectionLayout.invalidateLayout()
}
于 2016-03-30T15:45:37.190 回答
1

我尝试了 RileyDev 的回答,但应用程序进入了无限循环。

只有当应用程序的窗口边界发生变化时才会执行委托,因此我制作了自己的 viewWillTransition(to size 和 traitCollectionDidChange.xml) 版本。

使用下面的代码,即使特征没有改变,您也可以检测窗口边界大小的变化,并相应地调整集合视图单元格的大小,从而使集合视图布局无效。

var previousWindowBounds: CGRect?

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    if let currentBounds = view.window?.bounds,
        let previousWindowBounds = previousWindowBounds, currentBounds != previousWindowBounds {
        collectionView?.collectionViewLayout.invalidateLayout()
    }

    previousWindowBounds = view.window?.bounds
}
于 2017-06-21T09:36:47.223 回答