既存アプリをiPhone6/Plus解像度に対応させたのですが、色々苦労しました。
特にはまったこと3つです。
###(1)機種名でレイアウトを変更しない
iPhone6(Plus)にはOS設定に 表示を拡大する というのがあります。
これをONにすると、
- iPhone6Plusは内部的にiPhone6解像度で動作し拡大表示、
- iPhone6は内部的にiPhone5解像度で動作し拡大表示
になります。
つまり、iPhone6Plusだったらレイアウトを切り替える という処理を書くと自動拡大時に予想と違うレイアウトになる可能性が大きいです。
自分は スクリーンの高さが700以上だったら で対応しました。
[UIScreen mainScreen].bounds.size.height >= 700
iPad対応まで考えると別の条件式になると思います。(※iPad対応はしていない)
http://qiita.com/tomohisaota/items/f8857d01f328e34fb551
が非常に参考になりました。
###(2)AutoResizingMaskでは限界があった
AutoLayoutだとパフォーマンスが落ちるので、「頻繁に使う画面は非AutoLayout、頻度の低い画面はAutoLayout」としていました。
が、このせいでいろいろと苦労を...
AutoResizingMaskではどうしてもうまく配置しきれず、結局Viewクラス作成>layoutSubviewsで機種判別し手動配置、というパターンが多かったです。
特に差がでるのが、 アスペクト比維持の幅(高さ)指定 です。
これがInterfaceBuilderから指定できるようになったので格段にAutoLayoutのほうがよかったです。
AutoLayoutの設定自体もXcode6でかなりUIが改善され使いやすくなりました。
毛嫌いしてた方も一度挑戦してみていいと思います。
###(3)Constrain to margin は使わない
Xcode6でレイアウト制約を追加しようとするとき、 Constrain to margin がチェック入っているのですが外したほうがいいです。
外さなくても動きはしますが、Layout attributes relative to the layout margin on iOS versions prior to iOS8 という警告がでて精神的に不安定になります。
(Deployment TargetがiOS8だと出ません)
制約追加時にチェックを外しましょう。
忘れると、どの制約のせいで警告が出てるのか分からず警告削除に非常に苦労します...
###One more thing...
作ってて、iPhone6Plusでのみレイアウトを切り替える、というのはApple的に非推奨ではないかと感じました。
- xibファイルを6Plusのときに自動で切り替える手段がない(あったら教えてください...)
- 6Plusのみレイアウトを変えた場合、「自動拡大」と逆転する場合がある
後者が地味に厄介(?)です。
「height>700 だと30%フォントを大きくする」としたところ、自動拡大のほうが表示されるフォントが小さくなってしまいました。
見づらいから自動拡大にしたはずなのに、逆に文字が小さくなるという間抜けな話です。
(30%がやりすぎだったのは事実ですが...)
またAndroidと違い、開発環境も解像度の差に対するサポートが甘いです。
このことから、Appleは6Plusでレイアウトを切り替える処理は考えてないのではないかと感じました。
レイアウトを変えるぐらいならDynamicTypeサポートしろ ということかもしれません。