最近仕事もプライベートも忙しい lovee です。お久しぶりです。
この記事は業務などでよく見かける機種判定/画面判定のアンチパターンについてお話ししたいと思います。
機種ごとの特殊処理を画面サイズ判定で行う
昔ゲーム業界にいた時に割とよく目にするやり方、言うまでも間違いです。
ゲームでは良く綺麗な画面を作るために複雑な演算が必要になりがちですが、古い機種でそのままやると間違いなくフレーム落ちするので、代わりにちょっと雑だけど早い演算が必要だったりします。そしてその切り替えを機種ごとで切り替えたりする必要があります。ところがそれを画面サイズで判断し、例えば 568 x 320 なら古い機種と判定して雑だけど早い演算に切り替えたりすることがあります。ところが iPhone SE が出た時、画面サイズこそ古いですがなかのスペックはかなり速く、普通に複雑な演算を使ってもいいです;逆に現在はまだ逆のパターンが出ていませんが、いつかアップルが急に「これこそ廉価版」とか言って画面サイズだけ最新のものにするけどスペックを古いものにしてもさほどおかしくないです。
機種ごとの処理を切り分ける際はきちんと UIDevice.current.model
で切り分けましょう。画面判定はやめましょう。
レイアウト処理の切り分けを機種判定で行う
これは上の逆のアンチパターンになります。
例えば、もし機種が iPhone X(Xs や XR 含む) なら Status Bar の高さを 44、それ以外なら 20 にしたレイアウトを行う、と言う処理をした時、今後 iPhone が更に違う機種出た時に全てハードコーディングするしかないので非常に不便です。
また、iPhone 専用アプリとして iPad で動作された時に 480 x 320 の画面サイズでレイアウトさせる、と言うのも非常にまずいです。これは仕様変更でいつでも表示サイズが変わってしまう可能性があります。実際今年の iOS 12 では仕様変更で 568 x 320 のサイズで動くようになりましたし。
レイアウト処理を切り分ける際はきちんと UIScreen.main.bounds
で切り分けましょう。機種判定はやめましょう。
以上、簡単ですが、iOS Advent Calendar 2018 21 日目の記事でした。