先看下UIView.h中的解释
// animatable. do not use frame if view is transformed since it will not correctly reflect the actual location of the view. use bounds + center instead.
@property(nonatomic) CGRect frame;
// use bounds/center and not frame if non-identity transform. if bounds dimension is odd, center may be have fractional part
@property(nonatomic) CGRect bounds; // default bounds is zero origin, frame size. animatable
其中 frame与center是以父视图作为参照坐标系,而bounds是以自身作为参照坐标系,也就是说,定义bounds的时候,是去给它远点进行定义
举个栗子
UIView* v1 = [UIView new];
v1.backgroundColor = [UIColor redColor];
v1.frame = CGRectMake(50, 50, 200, 200);
v1.bounds = CGRectMake(100, 100, 200, 200);
[self.view addSubview:v1];
UIView* v2 = [UIView new];
v2.backgroundColor = [UIColor grayColor];
v2.frame = CGRectMake(60, 60, 200, 200);
[v1 addSubview:v2];
先看运行结果
可以看到我们把灰色的view add到红色的view上
frame为CGRectMake(60, 60, 200, 200)
明显灰色的view位置已经超出红色的view了。
分析下
v1.frame = CGRectMake(50, 50, 200, 200);
这段代码设置了红色view相对于self.view的位置,所以红色的view参照坐标系是self.view。
v1.bounds = CGRectMake(100, 100, 200, 200);
此时设置了v1的bounds,可以看到x = 100,y = 100
bounds设置的是自身的坐标系,也就是说,v1的左上角原点在自身坐标系中的坐标为(100,100)
然后在后面代码中
v2.frame = CGRectMake(60, 60, 200, 200);
v2添加再v1上,它的frame也就是相对于父视图(v1)的坐标为(60,60)
所以v2的原点在v1的原点左上方。