如何计算 iOS 11 不同方向的尺寸?
How to calculate iOS 11 size in different orientation?
我根据具有水平滚动和自定义布局的 UICollectionView 的安全区域计算 itemSize。
但是对于iPhone X 安全区域对于不同的方向有不同的大小。我的问题是我应该如何计算 viewWillTransition 函数中横向的安全区域大小?或者没有这个计算怎么可能?
编辑
要在不创建任何额外视图的情况下获得安全区域大小,请使用:
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 将其固定到安全区域指南,以便它始终与安全区域的大小相匹配:
我创建了 UIView
的 @IBOutlet
并在 viewDidLayoutSubviews()
中检查大小:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print(containerView.frame.size)
}
旋转后,我还获得了该 UIView 的更新大小。
使用 UICollectionViewDelegateFlowLayout 的 collectionView(_:layout:sizeForItemAt:)。奇迹般有效。
在 viewWillTransition(to:with:) 的 coordinator.animate(alongsideTransition:completion:) 的完成块中设置大小对我不起作用,因为大小动画发生在方向动画结束后,看起来很奇怪。
我根据具有水平滚动和自定义布局的 UICollectionView 的安全区域计算 itemSize。
但是对于iPhone X 安全区域对于不同的方向有不同的大小。我的问题是我应该如何计算 viewWillTransition 函数中横向的安全区域大小?或者没有这个计算怎么可能?
编辑
要在不创建任何额外视图的情况下获得安全区域大小,请使用:
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 将其固定到安全区域指南,以便它始终与安全区域的大小相匹配:
我创建了 UIView
的 @IBOutlet
并在 viewDidLayoutSubviews()
中检查大小:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print(containerView.frame.size)
}
旋转后,我还获得了该 UIView 的更新大小。
使用 UICollectionViewDelegateFlowLayout 的 collectionView(_:layout:sizeForItemAt:)。奇迹般有效。 在 viewWillTransition(to:with:) 的 coordinator.animate(alongsideTransition:completion:) 的完成块中设置大小对我不起作用,因为大小动画发生在方向动画结束后,看起来很奇怪。