文章目錄
- iOS坐標系
- frame
- bounds
- 只改變size
- 只改變origin
- 總結
iOS坐標系

frame和bounds都屬于CGRect型別的結構體

struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
包含一個CGPoint(起點)結構體跟一個CGSize(尺寸)結構體
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
注意
CGRect資料型別的高度和寬度可以是負數
例如
一個矩形的大小是[10, 10]
完全等同與大小是[-10, -10]的矩形
frame
frame是UIView的屬性 用來描述UIView及其子類所表示的視圖的位置(origin)和大小(size)
在僅使用frame來布局視圖時
視圖的位置和大小是被唯一確定了的 不會跟隨父視圖的變化而變化
除非在某個時間點在此設定了frame
frame表示view在父視圖坐標系統中的位置和大小
參考坐標是父視圖的坐標系統
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
viewA.backgroundColor = [UIColor blueColor];
[self.view addSubview:viewA];
UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
viewB.backgroundColor = [UIColor redColor];
[viewA addSubview:viewB];
UIView *viewC = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
viewC.backgroundColor = [UIColor yellowColor];
[viewB addSubview:viewC];
}
雖然3個view的起點都是[50, 50]
但是由于每個view的父視圖不同
導致了顯示出來的位置也不同
這就可以看出來frame的位置是根據父視圖的坐標來確定的

bounds
The bounds rectangle, which describes the view’s location and size in its own coordinate system.
根據蘋果官方檔案 bounds是控制元件相對于其自身坐標系得出的位置和大小
只改變size
更改bounds的大小 bounds的大小代表當前視圖的長和寬
當前視圖的中心點保持不變 長寬進行改變
看起來像以中心點為基準點對長寬兩邊同時進行縮放
viewA.bounds = CGRectMake(0, 0, 100, 100);
添加這一句之后
下面是對照組 就是之前的樣子

可以看出
之間藍色視圖的中心在黃色視圖的左上角尖尖那里
就是根據那個中心來進行縮放的
并且也同時改變了子視圖的位置
只改變origin
更改bounds中的位置不會對本視圖產生影響 但是會影響子視圖的位置
因為這更改了當前視圖的坐標系
對應子視圖來說 當前視圖的左上角已經不再是[0, 0] 而是更改之后的坐標
viewA.bounds = CGRectMake(50, 50, 200, 200);
這次是加這一句

藍色視圖的位置并沒有改變
而是改變了兩個子視圖的位置
總結
- frame不管改變位置還是大小 都會影響自己
- frame以父視圖的坐標系作為參考 從而確定當前視圖在父視圖的位置
- frame和bounds在改變大小的時候 frame的基準點是左上角 bounds的基準點是中心點
- bounds改變位置時 不會影響自身 子視圖的位置會發生變化 默認自身坐標系原點是左上角
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/295209.html
標籤:其他
