iPadとiPhone出だし分けるときはUITraitCollectionで確認すべし!

はじめに

iPhoneとiPadで処理の分岐をしたいときどのように記述しているでしょうか?

普通に検索すると以下のコードのようにUIDevice.current.userInterfaceIdiomで判定する方法が出てきますが、スマートではありません。

if UIDevice.current.userInterfaceIdiom == .phone {
   // iPhoneでしたい処理
} else if UIDevice.current.userInterfaceIdiom == .pad {
   // iPadでしたい処理
}

TraitCollectionを使った出し分け

iPhoneとiPadは縦横の長さで判別した方が良いです。

let horizonSizeClass = UITraitCollection(horizontalSizeClass: .regular)
let verticalSizeClass = UITraitCollection(verticalSizeClass: .regular)

if traitCollection.containsTraits(in: horizonSizeClass)
    && traitCollection.containsTraits(in: verticalSizeClass) {
    //iPadでしたい処理
} else {
    //iPhoneでしたい処理
}

以下の画像はAppleの公式ドキュメントから引っ張ってきた画像です。現在発売されている全てのiPadは[Regular, Regular]になっています。

https://developer.apple.com/documentation/uikit/uitraitcollection