UIView具有 frame、 bounds、 center和 origin的属性,它们似乎都是相互关联的。大多数情况下,我在设置 UIView的位置和大小时处理 frame。我知道 frame使用的是全局坐标系,而 bounds使用的是局部视图的坐标(因此它的 x 和 y 是0,但并不总是) ,但是什么时候使用仍然让我感到困惑。
UIView
frame
bounds
center
origin
在什么情况下(什么是正确的时间)应该使用其他属性(bounds,center,origin) ?
center、bounds和frame的属性是互锁的:更改其中一个将更新其他属性,因此可以根据需要使用它们。例如,只需更新center属性,而不是修改frame的X/y参数来使视图重新居中。
马可的上述回答是正确的,但只是在“在什么背景下”的问题上展开……
框架——这是普通iPhone应用程序最常用的属性。大多数控件将相对于“包含”控件进行布局,因此Frame.Origin将直接对应于控件需要显示的位置,而Frame.Size将确定控件的大小。
中心-这是您可能会关注的基于Sprite的游戏和动画的属性,其中可能会发生移动或缩放。默认情况下,动画和旋转将基于UIView的中心。尝试通过Frame属性管理此类对象很少有意义。
界限-此属性不是定位属性,但定义了UIView “相对于”框架的可绘制区域。默认情况下,此属性通常为(0,0,__abc2,__abc3)。更改此属性将允许您在框架外绘图或将绘图限制在框架内的较小区域。在下面的链接中可以找到对此的很好的讨论。除非有调整绘图区域的特定需要,否则通常不会操作此属性。唯一的例外是,大多数程序将在启动时使用[[UIScreen mainScreen] bounds]来确定应用程序的可见区域,并相应地设置其初始UIView的框架。
[[UIScreen mainScreen] bounds]
为什么在UIView中有一个框架矩形和一个边界矩形?
希望这有助于澄清每个属性可能被使用的情况。
它们是相关的值,并由属性setter/getter方法保持一致(并利用frame是一个纯粹的合成值,而不是由实际的实例变量支持这一事实)。
主要方程式为:
frame.origin = center - bounds.size / 2
(与相同)
center = frame.origin + bounds.size / 2
(还有)
frame.size = bounds.size
这不是代码,只是表达三个属性之间的不变量的方程。这些等式还假设视图的变换是恒等式,默认情况下是恒等式。如果不是,则边界和中心保持相同的含义,但框架可以改变。除非您正在进行非直角旋转,否则帧将始终是根据SuperView的坐标转换的视图。
这里有一个有用的迷你库,可以更详细地解释这些东西:
http://bynomial.com/blog/?p=24.