iOS-深入了解frame和bounds的区别

摘要

iOS面试技术经常会被问道frame和bounds的区别,你能答出几点?我们经常使用frame,却很少使用bounds,bounds的原点永远都是(0,0)麽?如果一直是(0,0)那么bounds存在的意义是什么呢?

正文

相信大家都知道,frame的原点用于表示子view在父view的坐标系的位置。
而bounds的原点则是表示自己的内容相对于自己的坐标系的位置,bounds是view用于控制自己的内容的显示区域的属性。
如何理解上面的bounds是view用于控制自己的内容的显示区域的属性?
我们拿scrollview举例:
1) 不设置scrollview的bounds

在默认不设置scrollview的bounds的情况下,运行起来我们是看不到红色的按钮的,往下滚动scrollview,看到红色按钮,点击打印的结果如下:
打印结果
注意此时,scrollview的contentOffset: {0, 100},而bounds的原点也是是(0,100),scrollview的内容是从(0,100)这个点开始展示的。也就是说如果我不想滚动scrollview就能看到红色按钮,那么我只需要把scrollview的bounds的原点设置为(0,100)即可。

2) 修改scrollview的bounds为(0,100)如下图:
修改scrollview的bounds为(0,100)
直接运行代码,红色按钮就显示出来了,点击按钮,scrollview的bounds的原点和contentOffset保持一致。
上图很明显的验证了我们的推断:bounds就是view用于控制自己的内容的显示区域的属性,scrollview是通过控制自己的bounds来实现滚动的。

总结frame和bounds的区别

  1. frame的原点用于表示自己的位置在父控件的坐标系中的位置;
    bounds的原点则是表示自己的内容相对于自己的坐标系的位置,默认为(0,0),即自己的内容从(0,0)开始展示。
  2. frame的size表示自己的大小,bounds的size表示自己的内容的展示区域。一般的这两个size是同步改变的,但是也有特例(比如设置view的transform进行放大缩小,我们操作的都是frame的size,它的bounds的不变)。