0

UINavigationController または UITabBarController のように機能する UIViewController のカスタム サブクラスを作成しました。これを ToolbarNavController と呼びましょう。下部には、ユーザーが別のコンテンツ ビューに移動するためのコントロールを備えたツールバーがあります。

ToolbarNavController のビュー以外に 2 つのコンテンツ ビューがあります。どちらもペン先からロードされ、独自のコントローラーがあります。アプリは、そのうちの 1 つを表示することから始めます。ツールバーのボタンを使用すると、ユーザーはそれらを切り替えることができます。

これらのビューを ViewDidLoad の ToolbarNavController のビューのサブビューとして追加すると、ステータス バーとツールバーの間の領域をオーバーラップ/アンダーラップなしで埋めるように正しくサイズ変更されます。

しかし、ユーザーがツールバー ボタンを押したときに初めてサブビューとして追加して、2 番目のビューを遅延ロードしようとすると、iOS は親ビューのツールバーを考慮してビューのサイズを変更しません。これは私の Autolayout 制約を台無しにします。また、viewDidLoad でサブビューを追加しない場合、2 番目のビューに切り替える前にデバイスを横向きにすると、縦向きのフレームで読み込まれます。

結論:サブビューを viewDidLoad に挿入すると、iOS はサブビューのサイズを正しく調整し、自動回転を管理します。後で挿入するときは、フレームの向きを自分で検出する必要があります。(そして、何らかの理由でこれを行うと、オートローテーションが再び開始されます)。

何が起こっている?

4

1 に答える 1

5

viewDidLoad では、ビューはまだ解像度とインターフェイスの向きのレイアウトになっておらず、ビューのプロパティはインターフェイス デザイナーの場合と同じです。したがって、縦向きのビューがある場合は、viewDidLoad に入ったときにビューの初期プロパティが設定されます。そこにビューを追加すると、それが XIB ビューに追加されます。その後、iOS はビュー階層でレイアウトを実行し、必要に応じて挿入されたビューのサイズを変更します。ただし、後でビューを追加する場合、ビュー階層は既にレイアウトされているため、追加する新しいビューも正しくレイアウトされていることが期待されます。

ベスト プラクティスは、挿入先のビューのサイズを使用して必要なサイズを計算することです。たとえば、含まれているビューの幅の半分、または境界の 3 分の 1 などです。このようにして、インターフェイスの向きに依存しません。

于 2012-11-02T16:46:20.787 に答える