UIView的框架,范围,中心,原点,什么时候使用?


195

UIView有属性frameboundscenter,和origin,他们都似乎是相互关联的。在大多数情况下,我会frame在设置的位置和大小时进行处理UIView。我知道这frame使用的是全局坐标系,bounds并且使用的是局部视图的坐标(因此,其x和y为0,但并非始终为0),但是何时使用它仍然让我感到困惑。

在什么情况下(和什么是正确的时间)的其他属性(boundscenterorigin)应使用?


以下链接是最佳答案。stackoverflow.com/questions/5361369/…–
Ohmy

Answers:


240

马可的上述答案是正确的,但只是为了扩展“在什么背景下”这一问题。

边框 -这是您通常用于普通iPhone应用程序的属性。大多数控件将相对于“包含”控件进行布局,因此frame.origin将直接对应于控件需要显示的位置,而frame.size将确定控件的尺寸。

中心 -对于可能会发生移动或缩放的基于Sprite的游戏和动画,这可能是您关注的属性。默认情况下,动画和旋转将基于UIView的中心。通过frame属性尝试管理此类对象几乎没有任何意义。

bounds-此属性不是定位属性,而是定义UIView与框架“相对”的可绘制区域。默认情况下,此属性通常为(0,0,widthheight)。更改此属性将允许您在框架外部进行绘制或将图形限制在框架内的较小区域。在下面的链接中可以找到对此的很好的讨论。除非特别需要调整绘图区域,否则通常不会操纵此属性。唯一的例外是,大多数程序将[[UIScreen mainScreen] bounds]在启动时使用on来确定应用程序的可见区域,并相应地设置其初始UIView框架。

为什么UIView中有框架矩形和边界矩形?

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


33
我认为值得补充的bounds是,在视图上应用了转换时通常使用。在这种情况下,该frame属性是不确定的。正如其他答案所指出的那样,修改centerbounds分别等效于修改视图的位置和大小。
Stuart

36

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

主要公式为:

frame.origin = center - bounds.size / 2

(与之相同)

center = frame.origin + bounds.size / 2

(还有)

frame.size = bounds.size

那不是代码,只是方程式来表达这三个属性之间的不变性。这些方程式还假定视图的变换是身份,默认情况下是身份。如果不是,则边界和中心保持相同的含义,但是框架可以更改。除非您进行非直角旋转,否则根据超级视图的坐标,框架将始终是变换后的视图。

此处将通过有用的迷你库对这些内容进行更详细的说明:

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


18

属性centerboundsframe互锁:改变一个将更新别人,所以使用它们不过你想要的。例如,无需修改x / y参数frame来更新视图,只需更新center属性即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.