ichigoryume programming blog

プログラミングに関する備忘録。主にHTML5, C#, Swiftなど。

デバイスの方向変化を検出して表示を切り替えるViewControllerのサンプルコード

ポイント

  • 方向の変化はNotificationCenter.default.addObserver()でハンドラをセットすることで検出できる
  • 現在の方向はUIDevice.current.orientationで取得できるが、単純に縦か横かを判定するだけならViewの縦横どちらが大きいかで判定すれば十分
  • NotificationCenter.default.addObserver()のハンドラは、起動時になぜか数回コールされてしまうので、前回の方向を記憶し、本当に方向がかわったときのみ表示の変更を行うコードを入れるのがいい

コード

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    
    var lastIsVertical:Bool = false
    
    override func viewDidLoad() {
        super.viewDidLoad()

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

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        print("view will appear")
        if view.frame.width < view.frame.height {
            setupVertical()
        }
        else {
            setupHorizontal()
        }
    }

    @objc private func deviceOrientationChanged(notification:NSNotification) {
        
        print("orientation changed")
        
        if view.frame.width < view.frame.height {
            if lastIsVertical == false {
                setupVertical()
            }
        }
        else {
            if lastIsVertical == true {
                setupHorizontal()
            }
        }
        
    }
    
    func setupVertical() {
        print("vertical")
        label.text = "vertical"
        
        lastIsVertical = true
    }
    
    func setupHorizontal() {
        print("horizontal")
        label.text = "horizontal"

        lastIsVertical = false
    }
}

実行結果

f:id:ichigoryume:20180908105526p:plainf:id:ichigoryume:20180908105531p:plain