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