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