5

これは、私がここで抱えていた問題 (まだ解決されていません) の続きです:リンク

しかし、これは何が問題なのかを理解するのに役立つかもしれません。簡単なテスト プロジェクト (「空のアプリケーション」) を作成し、XIB ファイルを含むビュー コントローラーを追加しました (チェック ボックス: 「ユーザー インターフェイス用の XIB ファイルを使用」を選択)。コードは次のようになります。

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"didLoad: %@",NSStringFromCGRect(self.view.bounds));

    // Do any additional setup after loading the view from its nib.
}

-(void) viewDidAppear:(BOOL)animated
{
    NSLog(@"didAppear: %@",NSStringFromCGRect(self.view.bounds));

}

これは出力です:

2013-07-26 17:05:28.502 testtest[5926:c07] didLoad: {{0, 0}, {320, 548}}
2013-07-26 17:05:28.506 testtest[5926:c07] didAppear: {{0, 0}, {320, 460}}

なぜ違うのですか?

(ps. 6.1 シミュレーターでテストしています)

4

5 に答える 5

3

メソッドが呼び出されると、viewDidLoadView Controller はストーリーボードまたは XIB からロードされたばかりなので、ビューの寸法は XIB にあるものと同じです (iPhone 5 の高さの寸法のように見えます)。

後でviewDidAppear:が呼び出されると、ビューは既に画面に表示されているため、実際に画面に収まるように適切にサイズ変更されています。ビューがロードされます。

あなたの場合、ストーリーボードまたは XIB ファイルが iPhone 5 の画面サイズ (548 = 1136/2 - ステータス バー) に設定されているように見え、iPhone 5 より前のシミュレーターまたは 480x320 のポイント画面を持つデバイスでテストしているので、ビューは、画面に収まるように高さ 460 ポイントにサイズ変更されます。

于 2013-07-26T13:22:58.083 に答える
1

これは完全に理にかなっています。

ViewDidLoadの最初のアクセス時に遅延して呼び出されるcontroller.viewため、その時点ではフレームはまだ設定されていません。これは、この時点ではフレーム/境界のサイズに依存できないことを意味します。これは、デフォルト値しか含まれていないためです (ただし、多くの場合、正しい値です)。ではViewDidAppear、通常、フレームが設定されます。ただし、親コントローラーがアニメーションを設定している場合、最終フレームの代わりに一時的なフレーム状態を設定することもできますが、慣例により、ビューが既に表示されているときにこのメソッドが呼び出されることは一般的ではありません。

たとえば、IB ファイルからビューをロードしている場合、取得されるフレームは IB ファイルにあるフレームですがviewDidLoad、ビューの最終的なサイズが小さい/大きい場合は、別のフレームが取得されます。あなたの 1 つviewDidAppear

その代わりに、フレームが設定されたときに適切に表示されるように、すべての要素をサイズ変更可能(Spring&Struts、AutoLayout、または他の同様の代替手段を使用) に作成する必要があります。

于 2013-07-26T13:23:50.323 に答える
0

がそのビューを表示するとき、ViewController通常はそのビューを縮小して、そのフレームがデバイスのステータス バーに重ならないようにします。

したがってNSLogviewDidLoadではビューがまだロードされていないためViewController、フレームはまだ縮小されていませんが、viewDidAppearではサイズ変更が行われています。に物件がありますUIViewController
wantsFullScreenLayout

このプロパティを YES に設定すると、View Controller はビューのサイズを変更して、ステータス バーの下の領域を含む画面全体に表示されるようにします。(もちろん、これを行うには、View Controller をホストするウィンドウ自体を、ステータス バーの下の領域を含めて画面全体を占めるようにサイズ変更する必要があります。) 通常、ステータスが半透明の場合は、このプロパティを YES に設定します。バーを開き、ビューのコンテンツがそのビューの背後に表示されるようにします。

于 2013-07-26T13:21:25.340 に答える