質問

一部のアプリケーション設計または一部の UIView では、navigationController の PushViewController に従って、新しいビューがステータス バーの高さだけウィンドウからずれてしまいます。その結果、このコード スタブを viewDidLoad メソッドに配置します。

CGRect  frameAt = [self.view frame];
CGRect  statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
frameAt.origin.y += statusBarFrame.size.height;
[self.view setFrame: frameAt];

これが XCode と Interface Builder の意図であるとは私には理解できません。そのため、ビューの設計中に SDK で何か根本的に間違ったことをしているのではないかと思います。さらに、視点を変える必要がない場合が稀にありますが、2 つの設計アプローチの違いがまったくわかりません。

また、ほとんどの場合、IB を使用してビューを設計しようとしていますが、多少のカスタマイズを加えていることにも注意してください。

他にこの問題に遭遇し、そのようなコードスタブなしで修正する方法を知っている人はいますか?

役に立ちましたか?

解決

私は試しに Appleのナビゲーションバーのサンプルコードを使用しましたこの問題を再現ます。

applicationDidFinishLaunchingは当初、このように実装されます:

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

私はこれに変更した場合:

UIViewController *shellController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[shellController.view addSubview:navigationController.view];
[window addSubview:shellController.view];
[window makeKeyAndVisible];

そして、私はギャップが出現し得る。

私はこれを行う場合しかします:

UIView *shell = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[shell addSubview:navigationController.view];
[window addSubview:shell];
[window makeKeyAndVisible];
その後、すべてが正常に見えます。

だから私はそのルートビューコントローラ場合は、すべてのビューコントローラがビューをオフセットしますね。しかし、ナビゲーションコントローラに関係なく、それがルートビューコントローラのかどうか、そのビューを相殺するために、この動作を無効にします。したがって、私はあなたがそれをすることになっていますよりも、階層内のどこかに下のナビゲーションコントローラを持っているので、あなたのギャップが表示されていると言うでしょう。

他のヒント

ここで留意すべき主な点は、ビュー コントローラーがビュー自体のフレームを設定するということです。これは、ビューで利用できるスペースの量はアプリの存続期間中に変化する可能性があり、ビューのフレームを適切に調整する方法を知っているのはビュー コントローラーだけであるためです。スペース量が変化する例としては、ナビゲーション バーの高さの変更、デバイスの縦向きから横向きへの切り替えなどが挙げられ、ユーザーが通話中にステータス バーの高さも高くなる可能性があります。このため、ビューのフレームを自分で変更しないでください。

したがって、最初に行う必要があるのは、ビューのフレームの変更に関連するすべてのコードを削除することです。

ここで、フレーム サイズがいつでも変更される可能性があることを念頭に置いてビューを設計する必要があります。これは、各サブビューの自動サイズ変更プロパティを適切に設定することを意味します。これを行う場合、シミュレートされたナビゲーションとステータス バーをオンにするかどうかは関係ありません。これらは、ほとんどの場合、最終結果がどのようになるかを確認するのに役立つだけです。

Interface Builder のサイズ インスペクター (ルーラー アイコンのあるもの) の各サブビューの自動サイズ変更プロパティを設定できます。アニメーションでは、白いボックスはビュー コントローラーのルート ビューを表し、赤いボックスは現在選択されているサブビューを表します。デフォルトでは、サブビューがルート ビューの左上隅に固定されていることがわかります。ビューのサイズが変わらない場合はこれで問題ありませんが、そうではないことがわかっています。どうしても一番下に表示したいサブビューがある場合は、左側の図をいじる必要があります。その仕組みは、エッジの周囲の 4 本の線のうちの 1 つが選択されている場合、ルート ビューのそのエッジとサブビューのエッジの間の距離が固定されるというものです。したがって、サブビューを下部に表示したい場合は、上部ではなく最下部の行が選択されていることを確認する必要があります。中央の 2 行は、ルート ビューのサイズが変更されたときにサブビューのサイズが変更されるかどうかに影響します。したがって、たとえば、画面の高さ全体を占めるテーブル ビューがある場合は、内側の垂直線が選択されていることを確認します。これはストラットとスプリングのモデルと呼ばれます。

プログラムでサブビューを追加する場合は、各サブビューに autoresizingMask プロパティを設定する必要があります。 ここに説明があります.

お役に立てば幸いです!

リンクテキスト

同様のバグがここで説明されています。

また、アニメーションセットはNOにありますか?これは私が直面していた同様の問題を解決してYESにそれを設定してみてください。

私は最終的にUIViewの要素のサイズ変更プロパティを制御するためのIBの点線/実線の意味を実現して

Moshyの答えはとても役に立ちました。

しかし、これらのプロパティを調整して、私は私のビューのいずれかに直面しても、同様の問題に対処していませんでした。このビューには、IBで定義されたステータスとトップバーを持っていました。それは、少し重いものでした viewWillAppearといくつかの他のインターフェイス要素内のHTML文字列をロードするのUIWebViewを含むます。

ビューをロードしている間、ユーザが突然の風景に肖像画からデバイスの向きを変更した場合、

は、ビューのすべての内容は、ステータスバーの高さによって下方にシフトします。ビューコントロールとその上部の間に生じる隙間があってもバック縦方向に切り替えた後に残るだろう。

最後に、私の問題を解決して、私の残りの髪は何、行を追加しました

    self.view.frame = [[UIScreen mainScreen] bounds];

タグ内で
-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

私の見解の内容が突然のデバイスの向きの変化にもかかわらず、所定の位置に保持されて以来ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top