2016-03-30 6 views
3

マルチタスキングを使用してiPadで自分のアプリをテストし、アプリのアプリのサイズを変更すると、コレクションビューのセルのサイズを変更する必要があります。そうしないとビューウィンドウに収まりません。マルチタスキングの使用時に表示サイズが変更された場合の通知の設定方法| Swift

は、私は、ユーザーがデバイスを変更するかどうかわから細胞は窓

  • 内に収まるようにするオブザーバを追加する
  • 対策ビューのサイズのセルのサイズを変更するには、デバイスを検出

    • ようないくつかの措置を講じてきました向き

    これはすべて素晴らしいですが、マルチタスキングを使用しているときに実際にウィンドウサイズを変更したり、フルスクリーンアプリに戻ったりすると、 ngeと場所を見てください。これは、向きを切り替えるか、ビューコントローラを切り替えることによって強制されるまでです。viewWillLoadまたはviewDidLoadが再度実行されます。

    view.frameのサイズが変更された場合、どうすれば通知を設定できますか?

  • +1

    あなたがストーリーボードに正しく制約を設定することができれば、その後、何も多くの問題があるでしょう優れていますあなたがオリエンテーションの変更について知りたければ、これをチェックしてください.. http://stackoverflow.com/a/256674 24/4874185 – Lee

    +0

    私はアプリ全体を通してですが、コレクションビューで作業するときには、セルと高さの両方に同じサイズを使用することは難しいため、高さと幅をセルに与える必要があります。実際には、ビューサイズを適切なサイズに調整するために、実際にビューサイズを分割します。 iPhoneの場合、1行に3つのセルが収まっていて、iPadの場合は6(cell.width = self.view.width/6)に収まっています。なぜなら、3がばかばかしく見えるからです。しかし、マルチタスキングを使用すると、ウィンドウがiPhoneの幅でスクリーンから外れると、アプリは6つのセルに収まるように試みます。 –

    +0

    "autolayoutを使用すべきです"という行は、テーブルとコレクションのビューで停止しません。しかし、それは言った、 'updateConstraints'メソッドは、' UIView'で呼び出され、よく、制約が更新する必要があるときに... – nhgrif

    答えて

    2

    私はあなたが問題を複雑にしていると思うので、デバイスを回転させたりサイズを変更したりすると、コレクションビューもそれに応じて変更されます。

    +0

    ありがとう、それは完璧に動作します!私はそれがユーザーのサイズを通知する問題ではなかったと思う。私は今、私のコードのいくつかをきれいにすることができます。 –

    2

    オーバーライドする正しい機能はviewWillTransition(to:, with:)だと思います。コンテナのサイズが変更される直前に呼び出されます。

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
        super.viewWillTransition(to: size, with: coordinator) 
    
        self.collectionView?.collectionViewLayout.invalidateLayout() 
    } 
    
    0

    私はRileyDevの回答を試みましたが、アプリは無限ループで入力しました。

    あり、単にアプリケーションのウィンドウの境界の変更が実行されて何のデリゲートがありませんので、私はサイズとtraitCollectionDidChangeにviewWillTransition(の自分自身のバージョンを作りました。

    ます以下のコードでは、ウィンドウの境界を検出することができます形質が変化し、それに応じコレクションビューのレイアウトを無効にあなたのコレクションビュー・セルのサイズを変更していない場合でも、変更のサイズを変更する。

    var previousWindowBounds: CGRect? 
    
    override func viewWillLayoutSubviews() { 
        super.viewWillLayoutSubviews() 
    
        if let currentBounds = view.window?.bounds, 
         let previousWindowBounds = previousWindowBounds, currentBounds != previousWindowBounds { 
         collectionView?.collectionViewLayout.invalidateLayout() 
        } 
    
        previousWindowBounds = view.window?.bounds 
    } 
    
    関連する問題