iOS開発におけるスクリーン回転の処理方法のいくつかを詳しく説明する

3921 ワード

前言:最近PhotoBrowserを書いたとき、画像を閲覧するときに画面の回転に合わせる必要があることに気づいた.そこで研究してみると、いくつかの処理方法といくつかの注意点があることが分かった.
PhotoBrowserの回転効果gif
  • スクリーンが回転している間に、インタフェースのレイアウトが新しいレイアウトに適合するように変化することを望んでいます.もちろん、storyBoardを使用してレイアウトすれば、システムは回転の適合を処理しており、追加の操作は必要ありません.
  • しかし、コードを使用してレイアウトする場合は、より多くの処理が必要かもしれません.
  • 回転時にコントローラのviewのboundsが変化するため、viewWillLayoutSubviews()などのメソッドを呼び出して再レイアウトします.これらのメソッドの中でレイアウトすると、インタフェースの内容は新しいレイアウトから、さらに、これらのメソッドの中でAutoLayoutレイアウトを使用する場合は、
  • を追加する必要はありません.
  • ただし、viewDidLoad()などのレイアウトであれば、インタフェースの内容は変化しません.スクリーンの回転を監視する場所を再レイアウトし、回転アニメーションなどの
  • を処理する必要があるかもしれません.
  • ビューを直接windowに追加すると、回転時にビューのboundsを変更するのに役立ちません.そのため、このビューのlayoutSubview()メソッドを呼び出して再レイアウトすることはありません.この場合、ビュー自体のframeを書き換え、そのビューのコンテンツレイアウトを再設定することを通知する必要があります.この場合、ポップアップビュー
  • としてviewをwindowに直接追加することが多い.
    UImit回転のメカニズム
    iPhoneの加速度計はIOS画面全体の回転の基礎である、加速度計に依存して機器が現在の機器方向を判断することができ、携帯電話が機器方向の変化を検出すると以下のような操作が行う.
  • デバイスが回転すると、UIKEtは回転イベント
  • を受信する.
  • UIKEはAppDelegateを通じて現在のプログラムのwindow
  • に通知する
  • WindowはそのrootView Controllerを知り、このview controllerがサポートする回転方向を判断し、
  • 回転を完了する.
  • ポップアップされたview controllerが存在する場合、ポップアップされたview controllerに基づいて、
  • を回転するか否かを判断する.
  • view controllerが回転をサポートすると、彼のviewのboundsが変化し、viewWillLayoutSubviews()などのメソッドを呼び出して
  • を再レイアウトします.
    一.1つ目の回転検出方法:通知を使用してUIdevice OrientationDidChangeNotificationをリスニングする
    携帯電話の物理的な方向が変化すると、U i d e v i c e O r i n t a t i o n D i d C h angNotificationという通知が発行されます.この通知を傍受すれば、通知の対応方法で回転中に必要な操作を処理できます.
      //1.      viewDidLoad()   view                   
            NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.orientation(_:), name: UIDeviceOrientationDidChangeNotification, object: nil)
    
    //2.             
        func orientation(noti: NSNotification) {
            /**        */
        }
    
    

    注意---この通知を使用すると、まず通知名「U i d e v i c e O r i n t i o n D i d C h angNotification」を見ると、「DeviceOrientation」から、この通知はデバイスの方向が回転するときに発行され、正確には携帯電話の物理方向が変化するときに発行され、携帯電話の画面の内容が回転していない場合でも発行されることがわかります.この方法を使用すると、現在のコントローラのページが回転していないなどの問題がありますが、この通知を傍受すると、携帯電話の方向が変化したときに対応するselectorが呼び出され、ページの方向が回転したいだけなので、望ましくない結果が得られます.
    二.第2の回転を検出する方法:通知を使用してU i a m i p l i c a t i o n D i d C h a n g e S o u s BarOrientationNotification,U i a i a n p p l i c t i o n D i d C h a n g e S u s BarOrientationNotificationをリスニングする
    この方法はUIApplicationの通知によりスクリーンの回転を傍受し,この2つの通知を傍受して処理することができる.
    ただし、名前を見ると、ステータスバーの方向変化を利用して回転方向を判断するので、ページが変化したときに正しく処理できますが、携帯電話の物理方向の変化を監視する必要がある場合は、第1の方法を使用します.
      //1.      viewDidLoad()   view                   
          //        
            NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(willOritate(_:), name: UIApplicationWillChangeStatusBarOrientationNotification, object: nil)
    
          //     
            NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(didOritate(_:), name: UIApplicationDidChangeStatusBarOrientationNotification, object: nil)
    //2.             
        fun willOritate(noti: NSNotification) {
            /**        */
        }
    
    fun didOritate(noti: NSNotification) {
    
    }
    

    三.以前は画面の回転を処理するために次の方法を書き換えることができましたが、iOS 8では破棄されました.
        //    
        override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
            
        }
        //     
        override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
            
        }
    

    四.次の方法をコントローラに書き換えて回転を処理できます.
        override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
            
        }
    

    注意:この方法を使うとき、私はとても不便な点を発見しました.この名前viewWillTransitionToSizeから、viewDidTransitionToSizeを見つけて回転完了を処理したいと思っていますが、残念ながらシステムAPIは提供されていません.前に述べたリスニング通知を選択して回転完了を処理するかもしれません.
    最後にPhtotBrowserのソースコードを提供します.役に立つと思ったら、starに励ましてあげてください.注目してください.