UIView的frame、bounds、center、origin,何时使用哪个?

196

UIView有四个属性:frameboundscenterorigin,它们似乎都是相互关联的。在设置UIView的位置和大小时,我大多数情况下处理的是frame。我知道frame使用全局坐标系统,bounds使用本地视图的坐标(因此其x和y为0,但并不总是如此),但仍然很困惑什么时候该使用什么。

在什么情况下(以及何时)应使用其他属性(boundscenterorigin)?


以下链接有最佳答案。 https://dev59.com/Zm435IYBdhLWcg3wigkk - Ohmy
框架(Frame)与边界(Bounds)的区别,附带图片:https://dev59.com/g3M_5IYBdhLWcg3w1G2N#28917673 - Suragch
3个回答

241

Marco在上面的回答是正确的,但为了进一步扩展“在什么情况下”这个问题...

frame - 这是您在正常的iPhone应用程序中最常使用的属性。大多数控件都将相对于“包含”控件布局,因此frame.origin将直接对应于控件需要显示的位置,而frame.size将确定控件的大小。

center - 这是您在基于精灵的游戏和动画中可能专注的属性,其中可能发生移动或缩放。默认情况下,动画和旋转将基于UIView的中心。尝试通过frame属性来管理这些对象很少有意义。

bounds - 这个属性不是一个定位属性,而是相对于frame定义UIView的可绘制区域。默认情况下,此属性通常为(0, 0, width, height)。更改此属性将允许您在frame之外绘制或将绘制限制在frame内的较小区域内。可以在下面的链接中找到关于这个问题的讨论。除非有特定需要调整绘图区域,否则不常操作此属性。唯一的例外是,大多数程序将在启动时使用[[UIScreen mainScreen] bounds]来确定应用程序的可见区域,并相应地设置其初始UIView的frame。

为什么在UIView中有一个frame矩形和一个bounds矩形?

希望这有助于澄清每个属性可能使用的情况。


33
值得一提的是,当视图应用变换时,bounds常被使用。在这种情况下,frame属性是未定义的。正如其他答案所指出的那样,修改centerbounds与分别修改视图的位置和大小等效。 - Stuart

36

它们是相关的值,并且通过属性设置器/获取器方法保持一致(并利用框架是仅合成值,而不是由实际实例变量支持的事实)。

主要方程式为:

frame.origin = center - bounds.size / 2

(它与...相同)

center = frame.origin + bounds.size / 2

(还有一件事)

frame.size = bounds.size

这不是代码,只是用方程式表示三个属性之间的不变性。这些方程还假定您的视图变换是默认为身份矩阵。如果不是,则边界和中心保持相同的含义,但边框可能会改变。除非您进行非直角旋转,否则框架始终是基于父视图坐标系下的变换后的视图。

这些内容在此有一个有用的小型库中详细解释:

http://bynomial.com/blog/?p=24


19

属性 centerboundsframe 相互关联: 改变其中一个属性将更新其他属性,所以你可以根据需要使用它们。例如,如果想重新调整视图的中心位置,不要修改 frame 的 x/y 参数,而是更新 center 属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,