【iOS】FrameとBoundsの違いを詳しく解説

iOS 座標系

iOS の固有の座標は、iOS 座標系の左上隅が座標原点であり、X の正の方向が右、Y の正の方向が下です。システムは、CGPoint (開始点) と CGSize (サイズ) サブ構造体を含めて、次のように定義さ
ここに画像の説明を挿入します
boundsますframeCGRect

struct CGRect {
    
    
    CGPoint origin;
    CGSize size;
};

原点はビューの各ビューの開始点を決定し、サイズはビューのサイズを決定します。

1.フレーム

フレームは各ビューの必須属性であり、親ビューの座標系におけるビューの位置とサイズを示します。基準点は親ビューの座標系です。

サンプルコード:

- (void)test_frame {
    
    
    UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];
    [viewA setBackgroundColor:[UIColor blueColor]];
    [self.view addSubview:viewA];
    NSLog(@"viewA - %@",NSStringFromCGRect(viewA.frame));

    UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    [viewB setBackgroundColor:[UIColor yellowColor]];
    [viewA addSubview:viewB];
    NSLog(@"viewB - %@",NSStringFromCGRect(viewB.frame));

    UIView *viewC = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    [viewC setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:viewC];
    NSLog(@"viewC - %@",NSStringFromCGRect(viewC.frame));
}

画像の説明を追加してください
画像の説明を追加してください

このように、viewBと の開始点はviewC一致していますが、印刷結果から判断すると、viewBの開始点は(50,50)、viewC開始点は(100,100)となっています。その理由は、フレーム内の位置は、現在のビューの位置を決定する基準となる親ビューの座標系に基づいており、viewB の親ビューは viewA、viewC の親ビューは self.view であるためです。 viewA の開始点は (50,50) であるため、viewB と viewC の開始点は一致します。

2. 境界

境界は各ビューが持つ属性でもありますが、ローカル座標系でのビューの位置とサイズを表すこの属性は通常は設定しません。参照点はローカル座標系です。上記の例の境界を出力すると、次の結果が得られます。

- (void)test_bounds {
    
    
    UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];
    [viewA setBackgroundColor:[UIColor blueColor]];
    [self.view addSubview:viewA];
    NSLog(@"viewA - %@",NSStringFromCGRect(viewA.bounds));

    UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    [viewB setBackgroundColor:[UIColor yellowColor]];
    [viewA addSubview:viewB];
    NSLog(@"viewB - %@",NSStringFromCGRect(viewB.bounds));

    UIView *viewC = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    [viewC setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:viewC];
    NSLog(@"viewC - %@",NSStringFromCGRect(viewC.bounds));
}

画像の説明を追加してください
境界値を設定しなかったので、境界は正確に何をするのでしょうか? ここで、各ビューには独自の座標系があり、この座標系はデフォルトで左上隅が座標原点として設定され、すべてのサブビューはこの座標系の原点を基点として使用することが強調されています境界の位置は、サブビューで表示されたときの現在のビューの左上隅の位置を表し、境界のサイズは現在のビューのサイズを表します。原則は次のとおりです。

  1. 位置の変更はbounds、現在のビューには影響しません。これは、現在のビューの座標系を変更することと同じです。サブビューの場合、現在のビューの左上隅は (0,0) ではなく、変更された座標になります。座標系が変更されると、すべてのサブビューの位置も変更されます
  2. 変更boundsのサイズはbounds、現在のビューの長さと幅を表します。長さと幅を変更した後、中心点は変更されず、長さと幅が変更されます。長さと幅を変更すると、中心点のように見えますbounds。点を基準にして両側の長さと幅を調整し、同時にズームします。

3. フレームと境界の違い

3.1 産地の違い

図に示すように:
ここに画像の説明を挿入します

このとき、ViewA の境界を (0,100) に変更すると、結果は次のようになります.この位置は、サブビューから見た現在のビューの左上隅の位置を表すことを
ここに画像の説明を挿入します
常に明確にする必要があります。遵守すべき原則:boundsbounds

  • 境界内の位置を変更しても、現在のビュー (ViewA) には影響しません。これは、ViewA の座標系を変更するのと同じですが、サブビュー (ViewB) は異なります。ViewB の場合、ViewA の左上隅は (0) ではなくなります。 ,0)ですが、(0,100)となっているので、ViewBの場合、実際にはViewAの座標系の原点は赤矢印の100上にありますが、このときViewBのframe.originは(200,100)なので、上はViewB の上部は ViewA の上部と一致します。

ViewA の境界を (200,0) に変更すると、同じことが当てはまります (自分で試してみることができます)、結果は次のようになります。
ここに画像の説明を挿入します

3.2 サイズの違い

フレームのサイズはビューのサイズを直接決定します。境界のサイズが変更された後も、ビューの中心点は変更されず、長さと幅は中心点に基づいて拡大縮小されます。

// frame bounds在size设置的区别
- (void)frame_bounds_size {
    
    
    UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];
    [viewA setBackgroundColor:[UIColor grayColor]];
    [self.view addSubview:viewA];

    UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(100, 50, 160, 120)];
    [viewB setBackgroundColor:[UIColor blueColor]];
    [viewA addSubview:viewB];

 
}

A ビューと BView を設定し、frame とbound を使用してそれぞれサブビューのサイズを変更します。

原画
画像の説明を追加してください

境界を使用して変更する

  [viewB setBounds:CGRectMake(0, 0, 320, 240)];

画像の説明を追加してください

フレームを使用して変更します。

[viewB setFrame:CGRectMake(100, 50, 320, 240)];

画像の説明を追加してください

左上の視点 B と視点 A の間の距離は、明らかに境界変更に基づく (100,50) ではなく、代わりに中心の視点 B に基づいてスケーリング操作が実行されることがわかります。

要約する

  1. フレームの位置やサイズに関係なく、変化するのはそれ自体です。
  2. フレームの位置は親ビューの座標系に基づいて、親ビュー内の現在のビューの位置を決定します。
  3. フレームのサイズが変更された場合、現在のビューの左上隅の位置は変更されず、サイズのみが変更されます。
  4. 境界の位置が変更されると、サブビューの位置が変更され、それ自体には影響しません。実際、それ自体の座標系の原点が変更されます。デフォルトでは、独自の座標系の原点は左上隅です。
  5. 境界のサイズが変更されても、現在のビューの中心点は変更されません。現在のビューのサイズが変更されると、その効果はスケーリングのように見えます。'

参考:フレームとバウンドの詳しい説明

おすすめ

転載: blog.csdn.net/weixin_61639290/article/details/131964286