1. frame
frame表示的是该view在父坐标系统中的位置和大小(参照父坐标系统),frame的(frame.origin.x, frame.origin.y)是相对于父坐标系的偏移量
- (CGRect)frame {
return CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height);
}
2. bounds
bounds表示的是该view在本地坐标系统中的位置和大小(参照本地坐标系统,就相当于View自己的坐标系统,以(0, 0)点为起点)
- (CGRect)bounds {
return CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
}
- bounds特点:可以通过修改自己坐标系的原点位置,进而影响到“子view”的显示位置;可以改变的frame,如果bounds>frame,那么frame也会跟着变大
注意
在实际使用中可以通过.bounds
或者setBounds
可以自定义视图的bounds,当然在自定义之后,其内部的子控件位置也会发生相关变化,具体变化的规律我做了一下简单的总结,下面就通过一个伪代码的式子来描述一下(获取子控件位置的y同理)
/** 获取子控件最终frame.origin.x(相对于根视图)
* superView.bounds.origin.x:父view自定义bounds的x
* superView.frame.size.width:父view原本的width
* superView.bounds.size.width:父view自定义bounds的width
* superView.frame.origin.x:父view原本的x
*********************** 华丽的分割线 ***********************
* subView.bounds.origin.x:子view自定义bounds的x
* subView.frame.size.width:子view原本的width
* subView.bounds.size.width:子view自定义bounds的width
* subView.frame.origin.x:子view原本的x
*/
lastX = (-(superView.bounds.origin.x) + (superView.frame.size.width - superView.bounds.size.width) / 2.0 + superView.frame.origin.x) + (- subView.bounds.origin.x + (subView.frame.size.width - subView.bounds.size.width) / 2.0 + subView.frame.origin.x))
3. Demo
有兴趣的话大家可以亲测一下
UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 350, 350)];
v1.backgroundColor = [UIColor redColor];
v1.bounds = CGRectMake(20, 20, 250, 250);
[self.view addSubview:v1];
NSLog(@"%lf~~~~%lf~~~~%lf~~~~%lf", v1.frame.origin.x, v1.frame.origin.y, v1.frame.size.width, v1.frame.size.height);
UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
v2.backgroundColor = [UIColor orangeColor];
[v1 addSubview:v2];
NSLog(@"%lf~~~~%lf", v2.frame.origin.x, v2.frame.origin.y);