使用多任务处理时,如果视图大小更改,如何设置通知| 迅速

A.R*_*Roe 3 ipad ios split-screen-multitasking

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

我已经采取了一些措施,例如

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

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

那么,如果view.frame大小发生变化,如何设置通知?

Jad*_*mec 6

我认为重写的正确功能是viewWillTransition(to:, with:)。每当容器大小即将更改时都会调用它。

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

    self.collectionView?.collectionViewLayout.invalidateLayout()
}
Run Code Online (Sandbox Code Playgroud)


Ril*_*Dev 5

我认为您使问题变得过于复杂,只需使用以下内容,以便当设备旋转或调整大小时,集合视图也会相应变化。

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()
}
Run Code Online (Sandbox Code Playgroud)