1

UITableViewシングル ビュー アプリで、メイン ビュー全体 (全幅と全高) をカバーする を設定する適切な方法は、次のviewDidLoadとおりであることを学びました。

table = [[UITableView alloc] initWithFrame:self.view.bounds];
table.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
                             UIViewAutoresizingFlexibleHeight;
[self.view addSubview:table];  

物理的な iPad 2 が横向きモードで保持されている場合、およびself.view.bounds上記が 内に印刷されている場合、次のようviewDidLoadに表示 されることに注意してください{{0, 0}, {768, 1004}}。だから私はアイデアは次のとおりだと思いました:幅と高さが正しくないことを心配しないでくださいUIViewAutoresizingFlexibleWidth. UIViewAutoresizingFlexibleHeightand は正しい幅とサイズを自動的に設定します.

だから私は実際に上記の最初の行を次のように置き換えてみました:

table = [[UITableView alloc] init];

また

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];

あるいは

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 1004, 768)];

または最終的に「正しい値」:

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 1024, 748)];

iPad 2 を横位置で保持した場合。しかし、現在、テーブルはメイン ビュー全体に完全には展開されません。では、ここでの支配原則は何ですか? 幅と高さを誤って設定することはできますが、{768, 1004}? 他の値では「正しくない」ことはありませんか? noCGRectが指定された場合、またはいくつかのダミー値が指定された場合、ランドスケープ モードまたはポートレート モードのいずれであっても、メイン ビューの幅と高さをテーブルに完全に合わせる{200, 200}には、コードで何を行う必要がありますか?viewDidLoad

4

3 に答える 3

1

を使用しないでください。代わりboundsに使用してください:frame

table = [[UITableView alloc] initWithFrame:self.view.frame];
table.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
                         UIViewAutoresizingFlexibleHeight;
于 2012-08-31T05:36:39.710 に答える
1

UIAutoresizingFlexibleWidth は、スーパービューの幅が拡大および縮小されると、ビューの幅が拡大および縮小されることを意味します。UIAutoresizingFlexibleHeight は、高さについても同じことを意味します。これらを追加することは、Interface Builder で「スプリング」をオンにすることと同じです。「支柱」が設定されていない場合、スーパービューの幅が 2 倍になると、ビューの幅も 2 倍になると思います。

支柱の設定は次のとおりです。

  • UIViewAutoresizingFlexibleRightMargin
  • UIViewAutoresizingFlexibleLeftMargin
  • UIViewAutoresizingFlexibleTopMargin
  • UIViewAutoresizingFlexibleBottomMargin

UIViewAutoresizingFlexibleRightMargin が設定されていない場合、右ストラットがオンになります。つまり、ビューの右側とそのスーパービューの右側の間のスペースは、ビューが拡大しても変化しません。同じ概念が他のすべての余白にも当てはまります。

ここにも良い議論があります: https://stackoverflow.com/a/10470469/472344

取得している self.view.bounds に混乱していると思います。jrturton が指摘したように、これは回転前のビューの境界です。ステータス バーに対して 20 ピクセルが差し引かれるため、高さは 1004 です。回転後に幅と高さが更新されなかった理由はわかりません(ビューをロードする前に回転が発生すると想定しています。そうでない場合、印刷された境界はまさに期待どおりです)が、後でこれにも気付きました回転。これについて Stackoverflow でいくつかの議論を見てきましたが、現時点では見つかりません。

私の推測では、jrturton が言ったように、ビューが読み込まれると、xib (またはストーリーボード) に設定された境界が使用され、viewDidLoad の後にサイズ変更が行われます。その時点で境界が変更されているはずなので、viewDidAppear で self.frame.view の境界を出力してみてください。

自動サイズ変更マスク設定の動作に再び対処するには、ビューのスーパービューのサイズが変更されない限り、これらは何もしないことを理解してください。自動サイズ変更マスク設定は、スーパービューのサイズが変更されたときに自動的にサイズを変更する方法をビューに指示します。テーブル ビューを常に self.view と同じサイズにしたい場合 (回転後やズーム後など)、行ったとおりに正確に設定する必要があります。

table = [[UITableView alloc] initWithFrame:self.view.bounds];
table.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
                         UIViewAutoresizingFlexibleHeight;
[self.view addSubview:table];
于 2012-08-31T13:40:31.633 に答える
0

1004 が正しい - ステータス バーは 20px です。最初のコード スニペットは問題ありません。

viewDidLoad では、ビューの向きは縦向きのままであることに注意してください。したがって、表示されている数字です。サイズ変更は後で行われます。サブビューのフレームとしてメイン ビューの境界長方形を使用すると、常にサブビューがビュー全体を埋めます。

于 2012-08-31T06:05:58.497 に答える