web-dev-qa-db-ja.com

UIViewのフレーム、境界、中央、Origin、いつ使用するのか?

UIViewにはプロパティframeboundscenter、およびOriginがあり、これらはすべて相互に関連しているようです。ほとんどの場合、frameの位置とサイズを設定するときにUIViewを扱います。 frameはグローバル座標系を使用しており、boundsはローカルビューの座標を使用している(したがって、xとyは0ですが、常にではない)ことを理解していますが、 。

どのコンテキスト(および適切なタイミング)で、他のプロパティ(boundscenterOrigin)を使用する必要がありますか?

194
Boon

上記のマルコの答えは正しいですが、「どのようなコンテキストの下で」の質問に拡張するだけです...

frame-これは、通常のiPhoneアプリケーションで最もよく使用するプロパティです。ほとんどのコントロールは「含む」コントロールに対してレイアウトされるため、frame.Originはコントロールを表示する必要がある場所に直接対応し、frame.sizeはコントロールの大きさを決定します。

center-これは、動きやスケーリングが発生する可能性のあるSpriteベースのゲームやアニメーションに焦点を当てるプロパティです。デフォルトでは、アニメーションと回転はUIViewの中心に基づきます。このようなオブジェクトをフレームプロパティで管理しようとすることはほとんど意味がありません。

bounds-このプロパティは位置決めプロパティではありませんが、UIViewの描画可能な領域をフレームに対して「相対的」に定義します。デフォルトでは、このプロパティは通常(0、0、widthheight)です。このプロパティを変更すると、フレームの外側に描画したり、フレーム内の小さな領域に描画を制限したりできます。これに関する適切な議論は、以下のリンクで見つけることができます。描画領域を調整する特別な必要がない限り、このプロパティが操作されることはまれです。唯一の例外は、ほとんどのプログラムが起動時に[[UIScreen mainScreen] bounds]を使用してアプリケーションの表示領域を決定し、それに応じて初期UIViewのフレームを設定することです。

IViewにフレーム長方形と境界長方形があるのはなぜですか?

これにより、各プロパティが使用される可能性のある状況を明確にすることができれば幸いです。

238
Barney Mattox

これらは関連する値であり、プロパティセッター/ゲッターメソッドによって一貫性が保たれます(また、フレームが実際のインスタンス変数に支えられていない純粋に合成された値であるという事実を使用しています)。

主な方程式は次のとおりです。

frame.Origin = center - bounds.size / 2

(これはと同じです)

center = frame.Origin + bounds.size / 2

(またあります)

frame.size = bounds.size

それはコードではなく、3つのプロパティ間の不変量を表す方程式です。また、これらの方程式は、ビューの変換がIDであると想定しています。これはデフォルトです。そうでない場合、境界と中心は同じ意味を保ちますが、フレームは変更される可能性があります。非直角の回転を行わない限り、フレームは常にスーパービューの座標に関して変換されたビューになります。

この内容はすべて、ここで便利なミニライブラリを使用して詳細に説明されています。

http://bynomial.com/blog/?p=24

36
Tyler

プロパティcenterbounds、およびframeは連動しています。1つを変更すると他のプロパティも更新されるため、必要に応じて使用してください。たとえば、frameのx/yパラメーターを変更してビューを中央揃えする代わりに、centerプロパティを更新するだけです。

18
Marco Mustapic