UIView有四个属性:frame、bounds、center和origin,它们似乎都是相互关联的。在设置UIView的位置和大小时,我大多数情况下处理的是frame。我知道frame使用全局坐标系统,bounds使用本地视图的坐标(因此其x和y为0,但并不总是如此),但仍然很困惑什么时候该使用什么。
在什么情况下(以及何时)应使用其他属性(bounds、center、origin)?
UIView有四个属性:frame、bounds、center和origin,它们似乎都是相互关联的。在设置UIView的位置和大小时,我大多数情况下处理的是frame。我知道frame使用全局坐标系统,bounds使用本地视图的坐标(因此其x和y为0,但并不总是如此),但仍然很困惑什么时候该使用什么。
在什么情况下(以及何时)应使用其他属性(bounds、center、origin)?
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矩形?
希望这有助于澄清每个属性可能使用的情况。
bounds常被使用。在这种情况下,frame属性是未定义的。正如其他答案所指出的那样,修改center和bounds与分别修改视图的位置和大小等效。 - Stuart它们是相关的值,并且通过属性设置器/获取器方法保持一致(并利用框架是仅合成值,而不是由实际实例变量支持的事实)。
主要方程式为:
frame.origin = center - bounds.size / 2
(它与...相同)
center = frame.origin + bounds.size / 2
(还有一件事)
frame.size = bounds.size
这不是代码,只是用方程式表示三个属性之间的不变性。这些方程还假定您的视图变换是默认为身份矩阵。如果不是,则边界和中心保持相同的含义,但边框可能会改变。除非您进行非直角旋转,否则框架始终是基于父视图坐标系下的变换后的视图。
这些内容在此有一个有用的小型库中详细解释:
属性 center、bounds 和 frame 相互关联: 改变其中一个属性将更新其他属性,所以你可以根据需要使用它们。例如,如果想重新调整视图的中心位置,不要修改 frame 的 x/y 参数,而是更新 center 属性。