1

UICollectionViewを使用してフルスクリーンの画像ギャラリーを作成しています。ユーザがデバイスを回転すると、私はモーダルこのUIViewControllerを提示し、UICollectionView全画面を占有有するSwift viewWillTransitionが呼び出されない

func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)

UICollectionViewへの更新を行います。 viewDidLoadの中で、私のようにフローレイアウトを作成します。

let flowLayout = UICollectionViewFlowLayout() 
flowLayout.scrollDirection = .horizontal 
flowLayout.minimumInteritemSpacing = 0 
flowLayout.minimumLineSpacing = 0 
photosCollectionView.isPagingEnabled = true 
photosCollectionView.setCollectionViewLayout(flowLayout, animated: true) 

私はまた、大きさを持っている:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    return photosCollectionView.frame.size 
} 

私は自分のデバイスを回転すると、viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)UICollectionViewLayoutを更新しないために発生した、と呼ばれることはありません。私は追加することができ、オンラインで読んだ

The behavior of the UICollectionViewFlowLayout is not defined because: the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values. 

::私は、デバイスを回転させながら、私はメッセージを取得行いませんUIViewController

self.automaticallyAdjustsScrollViewInsets = false 

を、それは何も影響を与えていました。 UICollectionViewにはコンテンツまたはセクションのインセットはありません。

私はまた、super.viewWillTransitionという機能を呼び出しています。この問題を引き起こしている可能性のあるものについて誰でも助けてくれますか?

+0

「アイテムの高さ」に関するエラーメッセージが表示されます。私はそれを決定するあなたのコードが表示されません。あなたはそれを見せてもらえますか? – matt

+0

サイズを設定すると、その高さと幅です。 'IndexPath' =' photosCollectionView.frame.size'に 'sizeForItem'を設定しました。 –

+0

さて、あなたが間違った時にそれを言うなら、どちらか一方または両方の次元がコレクションビューよりも大きいサイズを得るかもしれないと想像することができます。 – matt

答えて

2

デバイスが使用してくださいその後、回転したときには、レイアウトについてだけ心配している場合:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    collectionView.collectionViewLayout.invalidateLayout() 
    collectionView.layoutIfNeeded() 
} 

アップルのドキュメントから:

public func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 

をこのメソッドは、時にView Controllerのビューのサイズと呼ばれますその親(すなわち、 ウィンドウが回転したりサイズが変更されたときにルートビューコントローラ用)によって変更された です。 このメソッドをオーバーライドする場合は、変更を子に伝播するためにsuperを呼び出すか、手動で子に の変更を転送する必要があります。

私はまた、デバイスの回転のために登録することですあなたの周りの仕事スーパー

を呼び出すことなく、そのビューの親にこの関数を呼び出した可能性が推測:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    NotificationCenter.default.addObserver(self, selector: #selector(deviceOrientationDidChange), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) 
} 

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 

    NotificationCenter.default.removeObserver(self) 
} 

func deviceOrientationDidChange(_ notification: Notification) { 
    let orientation = UIDevice.current.orientation 
    print(orientation) 
} 
+0

それは可能ですが、 'viewWillTransition'関数が呼び出されない理由を説明していません。私は設定が間違っているかどうか疑問に思います。 –

+0

それは、ドキュメントで言うようにスーパーを呼び出さずに親に呼び出さない限り呼び出さなければなりません。あなたのコードに行くのではなく、上記の方法を示唆します – zombie

+0

'super'関数がすべて呼び出されたことを二重チェックしました。私はiPadでもテストしましたが、なんらかの理由で 'viewWillTransition'がiPad上で問題なく呼び出されました。 –

0

方法Iこれは、

プロジェクトのターゲットに移動 - 一般 - 展開情報

Tick Device Orient ViewControllerをのための

override var supportedInterfaceOrientations : UIInterfaceOrientationMask { 
    get { 
     return UIInterfaceOrientationMask.all; 
    } 
} 

:ationsアプリは

をサポートしています。また、あなたは(適切なものは何でものための変更UIInterfaceOrientationMask.all)が必要です。

関連する問題