UIViewの_bounds.Origin
_が_(0, 0)
_にならないのはいつですか?
この段落は私に役立ちました:
重要!!原点である境界XとYは、ビュー内を移動するためのものです。たとえばX + 5の場合、フレームの原点の左側に5pixを移動すると、このビュー内のすべてのコンテンツがフレームの原点の左側の5pixに描画されます。それ自体には何の影響もありません。影響を受けるのは、それに描かれているものです。
ただし、_bounds.Origin
_の値を自分で設定した場合のみを説明しています。
他にどのような場合にbounds.Origin != (0, 0)
の値は?
(受け入れられた後、元の回答を削除できないため、再度編集しました。これに対するクレジットはianにあり、ianは以下により詳細な回答を投稿しました:)
ほとんどの場合、これは起こりません。ビューを負の幅や高さで初期化すると、幅のXが負の値や高さのYが負の値の原点が得られます。
ビューのフレームは、そのスーパービュー内の場所を決定します。ビューの境界によって、そのサブビューの場所が決まります。つまり、ビューの境界を変更しても、その場所は変更されませんが、すべてのサブビューの場所は変更されます。
正の幅と高さは、左上から右下にビューを描画するのと同じですが、負の値は右下から左上になります。そう
_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];
_
そして、私たちは得ました:
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];
_
したがって、境界により、rightViewのサブビューはrightViewを初期化するOriginに従います。
RightViewの境界をleftViewに等しく変更すると、次のようになります。rightView.bounds= leftView.bounds;次に、2つのサブビューの場所が同じであるため、rightViewの幅と高さが負であるという情報が失われました。
そして、rightViewの代わりにleftViewの境界を変更します。CGRectbounds= leftView.bounds; bounds.Origin = CGPointMake(50、50); leftView.bounds =境界;
ご覧のとおり、そのサブビューのframe.Originはbounds.Originによってオフセットされています(プラスではなくマイナスを使用)。
結論として:
_view.bounds
_は、すべてのサブビューの場所(bounds.Originによるオフセット)を決定しますが、bounds
はスーパービュー内の自身の場所には影響しません。
負の幅と高さでビューを初期化すると、自動的に正に変更されますが(位置は変更されません)、その境界。原点は、ビューの「描画」を開始するポイントを示します。
ContentOffsetが(0、0)でない場合、UIScrollViewのbounds.Originは(0、0)にはなりません。
ビューを負の幅/高さで初期化すると、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
自分で試してみてください!