iOS UIView frame,bounds

先看下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];

先看运行结果

屏幕快照 2017-02-22 11.13.01.png

可以看到我们把灰色的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的原点左上方。

推荐阅读更多精彩内容