web-dev-qa-db-ja.com

異なる方向でiOS11のサイズを計算する方法は?

水平スクロールとカスタムレイアウトを使用して、UICollectionViewの安全な領域に応じてitemSizeを計算します。

image

ただし、iPhone Xの場合、安全領域のサイズは向きによって異なります。私の質問は、viewWillTransition関数で横向きの安全領域サイズをどのように計算する必要があるかです。または、この計算なしでどのように行うことができますか?

14
bogmila

[〜#〜]編集[〜#〜]

追加のビューを作成せずに安全な領域サイズを取得するには、次を使用します。

_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でセーフエリアガイドに固定して、セーフエリアのサイズと常に一致するようにすることでした。

enter image description here

そのUIViewの_@IBOutlet_を作成し、viewDidLayoutSubviews()でサイズを確認します。

_override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    print(containerView.frame.size)
}
_

回転後、そのUIViewの更新されたサイズも取得します。

11
jonaszmclaren

UICollectionViewDelegateFlowLayoutのcollectionView(_:layout:sizeForItemAt :)を使用します。チャームのように機能します。 viewWillTransition(to:with :)のcoordinator.animate(alongsideTransition:completion :)の完了ブロックでサイズを設定しても、サイズアニメーションが方向アニメーションの終了後に発生するため、機能しませんでした。これは奇妙に見えます。

0
GK100