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

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

```swift
//画面回転時によばれる
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

```swift
//画面回転時によばれる
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)

```swift
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」](http://dev.classmethod.jp/references/ios8-trait-collection/)