UIView的框架,边界,中心,原点,何时使用什么?

Boo*_*oon 194 frame uikit uiview bounds

UIView有属性frame,bounds,center,和origin,他们都似乎是相互关联的.大多数时候,我frame在设置a的位置和大小时处理UIView.据我所知,这frame是使用全局坐标系并bounds使用局部视图的坐标(因此它的x和y为0,但并非总是如此),但是在使用什么时我仍然会感到困惑.

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

Bar*_*tox 238

马克的上述答案是正确的,但只是为了扩展"在什么情况下"的问题......

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

center - 这是您可能会关注基于精灵的游戏和动画的属性,可能会发生移动或缩放.默认情况下,动画和旋转将基于UIView的中心.尝试通过frame属性管理这些对象很少有意义.

bounds - 此属性不是定位属性,而是定义UIView"相对"到框架的可绘制区域.默认情况下,此属性通常为(0,0,宽度,高度).更改此属性将允许您在框架外绘制或将绘图限制在框架内的较小区域.有关这方面的详细讨论可以在下面的链接中找到.除非特别需要调整绘图区域,否则操作此属性的情况并不常见.唯一的例外是大多数程序将使用[[UIScreen mainScreen] bounds]启动时确定应用程序的可见区域并相应地设置其初始UIView的帧.

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

希望这有助于澄清每个属性可能被使用的情况.

  • 我认为值得补充的是,当视图应用了变换时,通常会使用`bounds`.在这种情况下,`frame`属性是未定义的.正如其他答案所指出的那样,修改`center`和`bounds`等同于分别修改视图的位置和大小. (31认同)

Tyl*_*ler 36

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

主要方程是:

frame.origin = center - bounds.size / 2
Run Code Online (Sandbox Code Playgroud)

(与之相同)

center = frame.origin + bounds.size / 2
Run Code Online (Sandbox Code Playgroud)

(还有)

frame.size = bounds.size
Run Code Online (Sandbox Code Playgroud)

这不是代码,只是表达三个属性之间不变量的方程式.这些方程式还假设您的视图变换是标识,默认情况下也是如此.如果不是,则边界和中心保持相同的含义,但框架可以改变.除非您正在进行非直角旋转,否则帧将始终是超视图坐标的变换视图.

这里有一个有用的迷你库,这里有更详细的解释:

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


Mar*_*pic 18

属性和互锁:更改其他将更新其他属性center,因此您可以随意使用它们.例如,只需更新属性,而不是修改x/y参数以重新定位视图.boundsframeframecenter