一、首先在UIViewController的view上添加一个橙色窗口。如下图所示。
UIView * view = [[UIView alloc] init];
view.frame = CGRectMake(100, 100, 200, 200);
view.backgroundColor = [UIColor orangeColor];
[self.view addSubview:view];
打印出frame和bounds的值如下:
po view.frame
(origin = (x = 100, y = 100), size = (width = 200, height = 200))
po view.bounds
(origin = (x = 0, y = 0), size = (width = 200, height = 200))
网上也有个图很好的说明了两者之间的关系
frame: 该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
bounds:该view在本地坐标系统中的位置和大小。(参照点是本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)
center:该view的中心点在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
二、修改view的frame
view.frame = CGRectInset(view.frame, 50, 50);
po view.frame
(origin = (x = 150, y = 150), size = (width = 100, height = 100))
po view.bounds
(origin = (x = 0, y = 0), size = (width = 100, height = 100))
可以看到CGRectInset使x方向和y方向的2边都减少了50个点。这个结果我们也比较容易理解。
三,修改view的bounds
view.bounds = CGRectInset(view.bounds, 50, 50);
po view.frame
(origin = (x = 150, y = 150), size = (width = 100, height = 100))
po view.bounds
(origin = (x = 50, y = 50), size = (width = 100, height = 100))
这样修改后,view的frame跟上面一样。但bound的origin却不再是(0,0)了。这代表什么意思呢?
四,再给view添加一个绿色的子view
UIView * view = [[UIView alloc] init];
view.frame = CGRectMake(100, 100, 200, 200);
view.backgroundColor = [UIColor orangeColor];
[self.view addSubview:view];
view.bounds = CGRectInset(view.bounds, 50, 50);
UIView * subView = [[UIView alloc] init];
subView.frame = CGRectMake(0, 0, 30, 30);
subView.backgroundColor = [UIColor greenColor];
[view addSubview:subView];
由此可以看出,如果修改view的bounds,会对添加到其上的子subview的位置产生影响。view的bounds.origin修改了,则其左上角不再是(0,0),这里变成(50,50),如果subview的frame是(0, 0, 30, 30);则其会向左上角偏移50个点。
五、综合几个例子看看
1.给橙色的view添加一个绿色的subView
UIView * view = [[UIView alloc] init];
view.frame = CGRectMake(100, 100, 200, 200);
view.backgroundColor = [UIColor orangeColor];
[self.view addSubview:view];
UIView * subView = [[UIView alloc] init];
subView.frame = CGRectMake(0, 0, 30, 30);
subView.backgroundColor = [UIColor greenColor];
[view addSubview:subView];
打印一下可以知道现在的view.center是(200,200)!
然后改变view的frame大小位置
view.frame = CGRectMake(200, 400, 100, 100);
因为frame是相对于父窗口的,可以看到view的大小和位置都发生了改变。相对父窗口的位置变为(200,400),大小变为(100,100)。
此时的view.center是(250,450)
下面不改变view的frame,改变view的bounds:
view.bounds = CGRectMake(100, 50, 100, 100);
这里打印view.center,依然是(200,200).所以改变view.bounds
不会改变view.center。只是改变了view.bounds.origin(现在是(100,50))的和view.bounds.size(现在是(100,100))。如果添加一个subView其frame(0,0,30,30)则其会向上偏移50,向左偏移100。可以看到subView.frame,是基于父窗口的bounds。