LoginSignup
27
32

More than 5 years have passed since last update.

iOS:画面の向き、大きさ、端末によって表示を変える

Last updated at Posted at 2016-06-12

UITraitCollectionによる端末、SizeClass取得

縦向き-横幅 縦向き-縦幅 横向き-横幅 横向き-縦幅
下以外 Compact Regular Compact Compact
iPhone6sPlus Compact Regular Regular Compact
iPad Regular Regular Regular Regular
iPad SlideOver Compact Regular Compact Regular
iPad SplitViewの右(右で割る) Compact Regular Compact Regular
iPad SplitViewの左(右で割る) Compact Regular Regular Regular
iPad SplitViewの右(中央で割る) - - Compact Regular
iPad SplitViewの左(中央で割る) - - Compact Regular

Swift2.2

//画面回転時によばれる
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        getViewAppearance(size)
}

//画面サイズ変更時に呼ばれる
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
        getViewAppearance(self.view.frame.size)
}

func getViewAppearance(size: CGSize){
    //比較の基準を設定
    let horizontalSizeClass = UITraitCollection(horizontalSizeClass: .Regular)
    let device = UITraitCollection(device: .Pad)

    //iPadかどうか
    if traitCollection.containsTraitsInCollection(device){
        if traitCollection.containsTraitsInCollection(horizontalSizeClass) {
            //Regular
            print("iPad - 水平方向はRegular")
        }else{
            //Compact
            print("iPad - 水平方向はCompact")
        }
    }else{
        if size.width > size.height {
            //横向きの判定.
            print("iPhoneかiPod touch 横の長さのほうが長い")
        }else{
            //縦向きの判定
            print("iPhoneかiPod touch 縦の長さのほうが長い")
        }
    }
}

Swift3

//画面回転時によばれる
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        getViewAppearance(size)
}

//画面サイズ変更時に呼ばれる
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        getViewAppearance(self.view.frame.size)
}

func getViewAppearance(_ size: CGSize){
    //比較の基準を設定
    let horizontalSizeClass = UITraitCollection(horizontalSizeClass: .regular)
    let device = UITraitCollection(userInterfaceIdiom: .pad)

    //iPadかどうか
    if traitCollection.containsTraits(in: device){
        if traitCollection.containsTraits(in: horizontalSizeClass){
            //Regular
            print("iPad - 水平方向はRegular")
        }else{
            //Compact
            print("iPad - 水平方向はCompact")
        }
    }else{
        if size.width > size.height {
            //横向きの判定.
            print("iPhoneかiPod touch 横の長さのほうが長い")
        }else{
            //縦向きの判定
            print("iPhoneかiPod touch 縦の長さのほうが長い")
        }
    }
}

iPadで垂直方向がCompactになるときはないので、水平方向だけ見ればいいと思います。
iPhoneにSlideOverなどの機能はいまのところないので、画面が縦か横かだけを見ればいいと思います。
縦画面の時は横が狭くなるから上下にメニューを置き、横場面の時は縦が狭くなるから上か下にメニューをまとめる、といった使い方ができると思います。

↓これで十分じゃないかな(Swift3)

func getViewAppearance(_ size: CGSize){
    //比較の基準を設定
    let horizontalSizeClass = UITraitCollection(horizontalSizeClass: .regular)

    if traitCollection.containsTraits(in: horizontalSizeClass){
        //Regular
        print("水平方向はRegular")
    }else{
        if size.width > size.height {
            //横向きの判定.
            print("水平方向はCompact 横の長さのほうが長い")
        }else{
            //縦向きの判定
            print("水平方向はCompact 縦の長さのほうが長い")
        }
    }
}

参考:[iOS 8] マルチデバイス対応の新機能「Trait Collection」

27
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
32