web-dev-qa-db-ja.com

UIViewのbounds.Originが(0、0)でないのはいつですか?

UIViewの_bounds.Origin_が_(0, 0)_にならないのはいつですか?

この段落は私に役立ちました:

重要!!原点である境界XとYは、ビュー内を移動するためのものです。たとえばX + 5の場合、フレームの原点の左側に5pixを移動すると、このビュー内のすべてのコンテンツがフレームの原点の左側の5pixに描画されます。それ自体には何の影響もありません。影響を受けるのは、それに描かれているものです。

ただし、_bounds.Origin_の値を自分で設定した場合のみを説明しています。
他にどのような場合にbounds.Origin != (0, 0)の値は?

36
BergP

(受け入れられた後、元の回答を削除できないため、再度編集しました。これに対するクレジットはianにあり、ianは以下により詳細な回答を投稿しました:)

ほとんどの場合、これは起こりません。ビューを負の幅や高さで初期化すると、幅のXが負の値や高さのYが負の値の原点が得られます。

0

ビューのフレームは、そのスーパービュー内の場所を決定します。ビューの境界によって、そのサブビューの場所が決まります。つまり、ビューの境界を変更しても、その場所は変更されませんが、すべてのサブビューの場所は変更されます。

正の幅と高さは、左上から右下にビューを描画するのと同じですが、負の値は右下から左上になります。そう

_frame1 = CGRectMake(100, 100, -50, -50) 
_

と完全に同一です

_frame2 = CGRectMake(50, 50, 50, 50). 
_

実際、frame1でビューを初期化すると、AUTOMATICALLY CHANGED toframe2になります。

ただし、ビューの_bounds.Origin_は同一ではありません。 _Bounds.Origin_は、ビューを「描画」するポイントを示しているため、すべてのサブビューフレームはこのポイントから始まります。

たとえば、Landscape iPhone 6には、次のものがあります。

_UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 275, 275)];
leftView.backgroundColor = [UIColor greenColor];
[self.view addSubview:leftView];

UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(667-50, 375-50, -275, -275)];
rightView.backgroundColor = [UIColor blueColor];
[self.view addSubview:rightView];
_

そして、私たちは得ました:

enter image description here

RightViewのフレームは自動的に正の値((342、50、275、275))に変更されますが、そのbounts.Origin = (-275,-275)であることがわかります。

そして、サブビューを追加します。

_UIView *leftSubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
leftSubview.backgroundColor = [UIColor grayColor];
[leftView addSubview:leftSubview];
UIView *rightSubview= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
rightSubview.backgroundColor = [UIColor grayColor];
[rightView addSubview:rightSubview];
_

enter image description here

したがって、境界により、rightViewのサブビューはrightViewを初期化するOriginに従います。

RightViewの境界をleftViewに等しく変更すると、次のようになります。rightView.bounds= leftView.bounds;次に、2つのサブビューの場所が同じであるため、rightViewの幅と高さが負であるという情報が失われました。

enter image description here

そして、rightViewの代わりにleftViewの境界を変更します。CGRectbounds= leftView.bounds; bounds.Origin = CGPointMake(50、50); leftView.bounds =境界;

enter image description here

ご覧のとおり、そのサブビューのframe.Originはbounds.Originによってオフセットされています(プラスではなくマイナスを使用)。

結論として:

  1. _view.bounds_は、すべてのサブビューの場所(bounds.Originによるオフセット)を決定しますが、boundsはスーパービュー内の自身の場所には影響しません。

  2. 負の幅と高さでビューを初期化すると、自動的に正に変更されますが(位置は変更されません)、その境界。原点は、ビューの「描画」を開始するポイントを示します。

34
Sugar

ContentOffsetが(0、0)でない場合、UIScrollViewのbounds.Originは(0、0)にはなりません。

25
Cosyn

ビューを負の幅/高さで初期化すると、bounds.Originは負になります。たとえば、あなたがした場合

UIView* v = [[UIView alloc] initWithFrame:CGRectMake(5, 5, -10, -20)];

フレームは次のようになります。

Origin = {
  x = -5, 
  y = -15
}, 
size = {
  width = 10, 
  height = 20
}

境界:

Origin = {
  x = -10, 
  y = -20
}, 
size = {
  width = 10, 
  height = 20
}

センター:

x = 0, 
y = -5

自分で試してみてください!

16
ian