UIView&x27;s帧、边界、中心、原点,何时使用?

UIView&x27;s帧、边界、中心、原点,何时使用?,uiview,uikit,frame,bounds,Uiview,Uikit,Frame,Bounds,UIView具有属性frame、bounds、center和origin,它们似乎都是相互关联的。在设置UIView的位置和大小时,我通常处理frame。我知道,frame使用的是全局坐标系,bounds使用的是局部视图的坐标(因此其x和y为0,但并不总是),但我仍然不清楚何时使用什么 其他属性(bounds、center、origin)应该在什么上下文(以及什么时候合适)下使用?属性center、bounds和frame是互锁的:更改一个属性将更新其他属性,因此可以随意使用它们。例如,与其修改

UIView
具有属性
frame
bounds
center
origin
,它们似乎都是相互关联的。在设置
UIView
的位置和大小时,我通常处理
frame
。我知道,
frame
使用的是全局坐标系,
bounds
使用的是局部视图的坐标(因此其x和y为0,但并不总是),但我仍然不清楚何时使用什么


其他属性(
bounds
center
origin
)应该在什么上下文(以及什么时候合适)下使用?

属性
center
bounds
frame
是互锁的:更改一个属性将更新其他属性,因此可以随意使用它们。例如,与其修改
frame
的x/y参数以重新居中视图,只需更新
center
属性。

Marco上面的回答是正确的,但只需扩展“在什么上下文下”的问题

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

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

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


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

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

主要方程式如下:

frame.origin = center - bounds.size / 2
(同)

(还有

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

这里有一个有用的迷你库,可以更详细地解释这些内容:


我认为值得补充的是,当视图应用了变换时,通常会使用
边界。在这些情况下,
frame
属性未定义。正如其他答案所指出的,修改
中心
边界
相当于分别修改视图的位置和大小。下面的链接提供了最佳答案。帧与图片的边界:
center = frame.origin + bounds.size / 2
frame.size = bounds.size