UIView的框架,边界,中心,出处,什么时候用什么?

UIView具有属性frameboundscenterorigin ,它们似乎都是相互关联的。 大多数时候,我在设置UIView的位置和大小时处理frame 。 我知道frame是使用全局坐标系, bounds是使用本地视图的坐标(因此它的x和y是0,但并不总是),但是当我使用什么时,它仍然是令人困惑的。

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

马可的回答是正确的,但只是扩大“在什么情况下”的问题…

框架 – 这是您最常用于普通iPhone应用程序的属性。 大多数控件将相对于“包含”控件进行布局,所以frame.origin将直接对应控件需要显示的位置,而frame.size将决定控件的大小。

中心 – 这是您可能会关注的基于精灵的游戏和animation,可能会出现移动或缩放的属性。 默认情况下,animation和旋转将基于UIView的中心。 通过框架属性尝试和pipe理这些对象是很有意义的。

边界 – 这个属性不是定位属性,但定义了UIView“相对”的可绘制区域。 默认情况下,这个属性通常是(0,0, 宽度高度 )。 更改此属性将允许您在框架外绘制或将绘图限制在框架内的较小区域。 关于这方面的一个很好的讨论可以在下面的链接中find。 除非特别需要调整绘图区域,否则对该属性进行操作是不常见的。 唯一的例外是大多数程序会在启动时使用[[UIScreen mainScreen] bounds]来确定应用程序的可见区域,并相应地设置它们的初始UIView帧。

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

希望这有助于澄清每个财产可能被使用的情况。

它们是相关的值,并且通过属性setter / getter方法保持一致(并且使用frame是纯粹综合的值,而不是由实际的实例variables支持的事实)。

主要方程式是:

 frame.origin = center - bounds.size / 2 

(这是一样的)

 center = frame.origin + bounds.size / 2 

(也有)

 frame.size = bounds.size 

这不是代码,只是方程来表示三个属性之间的不variables。 这些等式也假设你的视图的变换是默认的身份。 如果不是,那么边界和中心保持相同的含义,但框架可以改变。 除非你做非直angular旋转,否则该框架总是以超视图的坐标表示的变换视图。

这个东西都详细解释了一个有用的迷你图书馆在这里:

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

属性centerboundsframe是互锁的:更改一个将更新其他,所以使用它们,无论你想要的。 例如,不要修改frame的x / y参数来重新定位视图,而只需更新center属性。