先日、Xcode 5とiOS 7でレイアウトが崩れるのに驚いて早10日が経ちましたが、モンハン4とドラクエXに時間を浪費していて対応に手がついていませんでしたorz
いろいろ解決方法はあって、iOS 6 と iOS 7 との違いでレイアウトがズレる可能性などを拝見すると、
・StoryBoard を使う
・AutoLayout を使う
・iOS 6/7 Deltas を使う
の3パターンありそうです。
このうち、上の2つは、最低でもiOS 6以上でないど動作しません。僕の持っている初代iPadはiOS 5止まりですし、治そうとしているアプリの性質(カードゲームのスコア管理)を考えると、古いOSで動かしている人も多いんじゃないかな、と思って、3つめの方法を使うことにしました。(勉強不足でStoryBoardを本格的に使ったことがない、 というのもあります)
もし、iOS 6/7 Deltasがルートビューに対して効果を発揮するのなら、何の問題もないのですが、ルートビューへの設定は綺麗に無視されます。ということは、xib上のすべてのオブジェクトに対して設定しろということですね・・。
これ、なんとか楽にコードで設定できないかと思ってやってみました。ベタな方法ですが、全部のSubViewをずらしてやります。
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { NSArray *arr; arr = [self.view subviews]; for(UIView *view in arr) { view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y + 20, view.frame.size.width, view.frame.size.height); } }
たしかに、この方法でうまくいきそうです。
ただし、全部のViewControllerに追記しないといけないのと、InterfaceBuilder上で「View as iOS 6.1 and Earlier」でプレビューしてもズレている状態になってしまうので、良し悪しですね。全部のオブジェクトにDeltaを設定するのも、Shift + クリックで複数選択して、一気にDeltaを設定できるので、それほど面倒ではないですし。(オブジェクトを追加した時に忘れそうですが)
新規で作るアプリはStoryBoardにしよう・・。