水平スクロールとカスタムレイアウトを使用して、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 :)の完了ブロックでサイズを設定しても、サイズアニメーションが方向アニメーションの終了後に発生するため、機能しませんでした。これは奇妙に見えます。