2

私はUIViewControllerにいて、self.view300x480のフレームを持つ有効なビューを指しています。

UIView *redView;
UIView *blueView;

//[[self view] setAutoresizingMask:YES]; //WRONG!
[[self view] setAutoresizesSubviews:YES];
[[self view] setClipsToBounds:YES];

redView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];

[redView setBackgroundColor:[UIColor redColor]];

[redView setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];

[[self view] addSubview:redView];

blueView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

[blueView setBackgroundColor:[UIColor blueColor]];

[blueView setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];

[[self view] addSubview:blueView];

このコードスニペットで私は試していました

  1. 200x200の赤いビューを右マージンに揃えるには、
  2. 100x100の青いビューを左マージンに揃えます。

しかし、あなたが見ることができるように、結果は私が期待していたものとはほど遠いです...

http://imageshack.us/photo/my-images/27/iossimulatorscreenshoto.png/

自動サイズ変更マスクの使用法に関するアップルのドキュメントとグーグルの結果をすべて読みましたが、なぜこれが起こっているのかまだわかりません。

誰かが私に何が起こっているのか説明してもらえますか?

前もって感謝します。

4

1 に答える 1

5

これは自動サイズ変更マスクであり、自動サイズ変更マスクではないことに注意してください。サイズが変わるまで何もしません。

あなたがしたいのは、親ビューの現在のサイズ、つまり300 x 480に従って、ビューのフレームを希望する場所に正確に定義することです。

redView = [[UIView alloc] initWithFrame:CGRectMake(100, 0, 200, 200)];

blueView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

自動サイズ変更マスクは、水平方向の配置まで正しく設定しています。self.viewのサイズが変更された場合、redViewとblueViewは余白にロックされたままになります。

柔軟な上マージン、柔軟な下マージン、または柔軟な高さの少なくとも1つを設定する必要があります。それ以外の場合、親ビューの高さが変更された場合の動作は未定義です。これらの3つのパラメーターすべてを2つの異なる高さ内に固定したままにすることは不可能です。

このコード行は意味がありません。

[[self view] setAutoresizingMask:YES];

BOOLは列挙型であるUIViewAutoresizingにキャスト可能であるため、コンパイラエラーではありません。その結果、YES = 1=UIViewAutoresizingFlexibleLeftMarginになります。おそらくあなたが望んでいたものではありません。あなたが望んでいた可能性が高い:

[[self view] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];

可能であれば、これはすべてInterfaceBuilderで行う必要があります。WYSIWYGエディターなので、SWYG(「何が得られるかを確認」)できます。オプションをすばやく試して、それらがどのように機能するかを学ぶことができます。編集-コンパイル-実行よりもはるかに高速で効果を確認できます。プロジェクトでInterfaceBuilderを使用できない、または使用しない場合でも、サンプルプロジェクトを試して、自動サイズ変更がどのように機能するかを確認してください。一度知ったら、試行錯誤の少ないコードでそれを行うことができます。ただし、Interface Builderでマージンバーをオンにすることは、コードで対応するFlexibleXYZMarginオプションをオフにすることと同じであるという落とし穴に注意してください。

于 2011-10-08T20:09:59.210 に答える