iOS frame与bounds区别详解

在iOS的UI开发中,frame和bounds是两个非常容易搞混的概念,而很多开发者在实际项目中也很少去区分,因此会导致出现一些意想不到的问题。本篇博客以实际代码的方式来学习frame和bounds的使用。相关示例代码上传至 https://github.com/chenyufeng1991/FrameAndBounds ,欢迎大家下载查看。

(1)先来查看一个界面中的容器self.view的frame和bounds的打印结果:下面的运行结果都在iPhone5s模拟器下进行。

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. NSLog(@"self.view.frame = %@",NSStringFromCGRect(self.view.frame));  
  2. NSLog(@"self.view.bounds = %@",NSStringFromCGRect(self.view.bounds));  

在这里我们可以看到,self.view的frame和bounds是一样的。原点都是在左上角。长宽正好是整个屏幕的宽高。


(2)frame和bounds难道都是一样的吗?当然不是。现在我们对一个View做一个旋转动画。

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. UIView *view01 = [[UIView alloc] initWithFrame:CGRectMake(1001005050)];  
  2. view01.backgroundColor = [UIColor grayColor];  
  3. [self.view addSubview:view01];  
  4. NSLog(@"view01.frame = %@",NSStringFromCGRect(view01.frame));  
  5. NSLog(@"view01.bounds = %@",NSStringFromCGRect(view01.bounds));  
  6.   
  7. [UIView transitionWithView:view01 duration:2 options:0 animations:^{  
  8.     view01.transform = CGAffineTransformMakeRotation(M_PI_4);  
  9. } completion:^(BOOL finished) {  
  10.     if (finished)  
  11.     {  
  12.         NSLog(@"view01.frame = %@",NSStringFromCGRect(view01.frame));  
  13.         NSLog(@"view01.bounds = %@",NSStringFromCGRect(view01.bounds));  
  14.     }  
  15. }];  
动画效果如下:

我们让一个正方形旋转90度,在动画开始前和结束后分别打印frame和bounds,打印结果如下:


此时可以看到,在动画开始前,frame和bounds也变得不一样了。在旋转动画后,frame发生改变,bounds依然没变。我现在告诉大家下面的结论:

-- frame的位置是根据父容器来计算的,正方形在动画开始前的x=100,y=100是相对于self.view的坐标系统而言的,从而确定当前视图在父视图中的位置。

-- bounds的x,y是根据自己的坐标系统而言的。没错,每个view都有自己的坐标系。以自己左上角点为坐标原点。所以bounds的x,y默认为(0,0),除非调用setBounds方法;

-- frame的size不一定等于bounds的size,在旋转后它们的size就不一样了。


在旋转前后,frame发生了较大的变化,其实旋转后的frame变成了如下:

旋转后:




旋转前:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值