21

通話中のステータス バーが切り替えられたときに、またはにview関連付けられているがどのように反応するかを理解しようとしています。 私の問題は、それらの動作が異なるように見え、これが副作用を引き起こすことです.UITabBarControllerUINavigationControllerUIViewController

上記の 3 つのタイプのウィンドウのルート ビュー コントローラーを変更するプロジェクトを作成し、の をダンプしdescriptionviewフレーム座標を取得します。


  • UIViewController

ここに画像の説明を入力

inCall ステータスOFF :

UIView: 0x4e2a1f0; フレーム = (0 20; 320 460); 自動サイズ変更 = W+H; ....
オン
UIView: 0x4e2a1f0; フレーム = (0 40; 320 440); 自動サイズ変更 = W+H; ...

これは私が理解していることです。通話中のステータスバーが表示されると、UIViewController のビューの高さが縮小して 20 を失い、y 座標が 20 から 40 に移動します。

それは最高です !UIViewControllerクラシックを aUITabBarControllerまたは aに置き換える場合も同じことが予想されますUINavigationControllerが、そうではありません。


  • UINavigationController

    ここに画像の説明を入力

InCall ステータス バーオフ

UILayoutContainerView: 0x4b35ab0; フレーム = (0 0; 320 480); 自動サイズ変更 = W+H; ..
オン
UILayoutContainerView: 0x4e1b060; フレーム = (0 0; 320 480); 自動サイズ変更 = W+H; ..

その場合、UINavigationController によって処理されるビューは、通話中のステータス バーが切り替えられたときにフレーム プロパティが変更されませんか?! (どうして ? :( )


  • UITabBarController

ここに画像の説明を入力 オフ

UIView: 0x4b2f6a0; フレーム = (0 20; 320 460); 自動サイズ変更 = W+H; ...
オン
UIView: 0x4b2f6a0; フレーム = (0 20; 320 460); 自動サイズ変更 = W+H; ...

と同じUINavigationController: のviewUITabBarController、incall ステータス バーが切り替えられたときに影響を受けないようです。


incallステータスバーが表示されたときにこのサイズ変更がどのように機能するかを誰かが説明してもらえますか?
私の最終目標は、全体の上に表示され、通話中ステータスが表示されたときに適切にサイズ変更されるを表示するUIViewことです。ただし、そのようなビューをビュー階層のどこに配置すればよいか本当にわかりません: UITabBarController のビューの子として追加すると、これは incall ステータス表示に反応しないため、私のビューも同様に反応しません: (UITabBarController

4

3 に答える 3

17

通話中ステータス バーが切り替えられたときのビューの高さは、固定方法によって異なります。

UIView の autoResizingMask をいじって、通話中のステータス バーが表示されたときにビューを下に移動するかサイズ変更するかを制御します。

この二つの性質、

UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleHeight  

が手伝う。最初のものはビューを押し下げ、2 つ目はサイズを変更します。

于 2011-07-01T07:11:27.187 に答える
4

通常の UIViewController の例では [ wantsFullScreenLayout] が NO に設定されているため、ビューのサイズが自動的に変更されるため、ステータス バーの下には表示されません。

一方、UINavigationController と UITabBarController のデフォルトwantsFullScreenLayoutは YES です。そのため、ビューはウィンドウ全体を占有し、サブビュー自体のサイズと位置を調整して、ステータス バーを適切に処理します。これらのコントローラーのプロパティを明示的に NO に設定すると、目的の動作が得られるはずです (ただし、wantsFullScreenLayoutYES に設定された子コントローラーを適切に処理する機能が失われます)。

UITabBarController の例では、ところで、タブ バー コントローラーのビューの情報を出力していないようです。ここでは、プレーンな UIView ではなく、UILayoutContainerView です。

于 2011-07-01T13:46:09.790 に答える
1

理想的には、ビューのサイズが変更される量を忘れて、自動サイズ変更マスクをいじる必要があります。

于 2011-07-04T07:27:55.357 に答える