実際には、ほとんどのアーキテクチャの問題と同様に、これは非常に複雑な問題だと思います。1 つの手法だけで問題を解決しようとするべきではないと思います。
このページの他のすべての回答を締めくくらないために、ブログに完全な記事といくつかのサンプル コードへのリンクも投稿しました。
概要
UI は .xib ファイルで表現することをお勧めしますが、今後アプリを変更する人のスキル セットに応じて、これからどの程度逸脱できるかが決まります。プログラマーだけじゃないかも!
優先オプション
1 つの .xib ファイルと 1 つのサブクラスで 1 つの論理ビューを実装することを強くお勧めします。UIViewController
それをするために本当に一生懸命努力してください。autoresizesSubviews=YES
XIB の rootを設定しview
、子ビューを適切に調整してautoresizingMask
、画面のサイズ/向きの変更に合わせて調整すると、大いに役立ちます。
しかし、それだけでは十分ではありません。 レイアウトを横向きに調整する必要があり、自動サイズ変更が処理できる範囲を超えている場合は、2 つの主なオプションを使用します。どちらを選択するかは、ビューのコンテンツによって異なります。
オプション 1
縦向きと横向きのレイアウトがあまり変わらない場合は、1 つの .xib のままにし、View Controller に少しのコードを入れて、回転時にレイアウトを調整することをお勧めします。
オプション 2
横向きと縦向きの違いが非常に大きい場合は、向きごとに 1 つの .xib を用意することをお勧めします ( と のような厳密な命名規則に従いMyViewController.xib
ますMyViewController-landscape.xib
)。ただし、両方の .xib ファイルは、File's Ownerを同じ View Controllerクラスに接続する必要があります。私にとって、これが鍵です。
推奨される代替手段以外のことを行う場合は、再利用可能なUIViewController
基本クラスを作成してこれを自動化し、一貫性を保つことをお勧めします。これは、最初に考えるよりも多くの作業であり、UIViewController
ローテーション処理が必要なすべてのサブクラスでこれを続けるのはばかげています。
解決
このような基本クラスを作成し、サンプル プロジェクトに入れました。 3 つのシナリオすべてを処理する必要があると私が考える方法の Hello World の例を確認できます。
- 1 つのビュー コントローラーと 1 つの .xib、自動サイズ変更のみ ( my
FirstViewController
)
- 1 つのビュー コントローラーと 2 つの .xibs、それらの間の自動切り替え (my
SecondViewController
)
- 1 つのビュー コントローラーと 1 つの .xib、ローテーションに関するマイナーなプログラム レイアウト (
ThirdViewController
)
私が使用するRotatingViewController基本クラスは、iPhone アプリにも同様に適用できます。私は実際には、iPadとiPhone、縦向きと横向きのレイアウト (ユニバーサル アプリ用) の維持を処理する、より複雑なバージョンを持っています。
しかし、この質問は iPad に関するものだけだったので、わかりやすくするために簡略化しました。
私の基本クラスimageNamed:
には、現在の向きに適した画像をロードするのに役立つユーティリティ メソッドもあります ( image-landscape.png規則で命名されています)。ただし、ほとんどの場合、代わりに伸縮可能な UIImage を使用する必要があると思います。
私はこれをしませんでしたが、デバイスの向きが変わったときに、ツリーをたどってまたはオブジェクトのプロパティを更新RotatingViewController
しようとすることもできました。私はそこまで行きませんでしたが、あなたならできます。subviews
image
UIButton
UIImageView
これらの推奨事項の根拠については、私が参照しているブログ投稿を参照してください。