14

我计算 itemSize 取决于 UICollectionView 的安全区域,具有水平滚动和自定义布局。

图片

但是对于 iPhone X 安全区域对于不同的方向有不同的大小。我的问题是我应该如何在 viewWillTransition 函数中计算横向的安全区域大小?或者没有这个计算怎么可能呢?

4

2 回答 2

11

编辑

要在不创建任何其他视图的情况下获得安全的区域大小,请使用以下命令:

view.safeAreaLayoutGuide.layoutFrame.size

如果你想使用viewWillTransition方法,你可以使用这个:

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

    // Before rotation
    print(view.safeAreaLayoutGuide.layoutFrame.size)

    coordinator.animate(alongsideTransition: { (context) in
        // During rotation
    }) { (context) in
        // After rotation
        print(self.view.safeAreaLayoutGuide.layoutFrame.size)
    }
}

在完成块中,您将获得所需的大小,但请注意,此代码将在旋转后调用。

原始答案

使用额外 UIView 的解决方案:

我所做的是创建一个UIView并用常量 0 将其固定到安全区域指南,以便它始终与安全区域的大小匹配:

在此处输入图像描述

我创建了一个@IBOutletUIView检查viewDidLayoutSubviews()了大小:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    print(containerView.frame.size)
}

旋转后,我还获得了该 UIView 的更新大小。

于 2017-09-19T13:04:41.713 回答
0

使用 UICollectionViewDelegateFlowLayout 的 collectionView(_:layout:sizeForItemAt:)。奇迹般有效。在 viewWillTransition(to:with:) 的 coordinator.animate(alongsideTransition:completion:) 的完成块中设置大小对我不起作用,因为大小动画发生在方向动画结束后,这看起来很奇怪。

于 2018-12-29T19:36:28.593 回答