10

一部のアプリケーション デザインまたは一部の 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 を使用してビューを設計しようとしており、いくつかの小さなカスタマイズを行っていることにも注意してください。

他の誰かがこれに遭遇し、そのようなコードスタブなしで修正するために何をすべきか知っていますか?

4

5 に答える 5

16

この問題を再現するために、Apple の NavBar サンプル コードを使用しました。

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];

その後、すべてが正常に見えます。

したがって、ルートView Controllerの場合、すべてのView Controllerがそのビューをオフセットすると思います。ただし、ルート ビュー コントローラーであるかどうかに関係なく、ナビゲーション コントローラーはこの動作をオーバーライドしてビューをオフセットします。したがって、ナビゲーション コントローラーが本来よりも階層の低い場所にあるため、ギャップが発生していると言えます。

于 2010-03-05T06:01:52.180 に答える
2

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

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

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

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

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

それが役立つことを願っています!

于 2010-03-04T08:35:02.807 に答える
1

私は同様の問題に遭遇しました。私の2つの前の質問をチェックしてください:

IPhone - Modal View Controller を閉じた後 - ページの上部にギャップが残る

IPhone - 上部の UIView addSubview ギャップ

于 2010-03-05T01:55:45.090 に答える
0

UIView要素のサイズ変更プロパティを制御するためのIBの点線/実線の意味を最終的に理解したので、Moshyの答えは非常に役に立ちました。

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

ビューの読み込み中に、ユーザーがデバイスの向きを縦向きから横向きに突然変更した場合、ビューのすべてのコンテンツがステータス バーの高さだけ下に移動します。ビュー コントロールとその上部の間に生じるギャップは、縦向きに切り替えた後でも残ります。

最終的に私の問題と残りの髪を解決したのは、次の行を追加することでした:

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

内部

-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

デバイスの向きが突然変わっても、ビューのコンテンツが保持されて以来。

于 2012-02-01T17:49:29.357 に答える
0

リンクテキスト

同様のバグがここで議論されています。

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

于 2010-06-29T07:14:54.227 に答える