【iOS_Development】frame VS bounds

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);

【iOS_Development】frame VS bounds_第1张图片

【iOS_Development】frame VS bounds_第2张图片

你可能感兴趣的:(ios,bounds,frame,iOS_Development)