【问题标题】:UIView's frame, bounds, center, origin, when to use what?UIView的frame,bounds,center,origin,什么时候用什么?
【发布时间】:2010-11-07 10:51:19
【问题描述】:

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

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

【问题讨论】:

标签: uiview uikit frame bounds


【解决方案1】:

Marco 上面的回答是正确的,但只是为了扩展“在什么情况下”的问题......

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

center - 对于可能发生移动或缩放的基于 sprite 的游戏和动画,您可能会关注此属性。默认情况下,动画和旋转将基于 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?

希望这有助于阐明可能使用每个属性的情况。

【讨论】:

  • 我认为值得补充的是,bounds 通常在视图应用了变换时使用。在这些情况下,frame 属性未定义。正如其他答案所指出的,修改centerbounds 相当于分别修改视图的位置和大小。
【解决方案2】:

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

主要方程有:

frame.origin = center - bounds.size / 2

(与此相同)

center = frame.origin + bounds.size / 2

(还有)

frame.size = bounds.size

这不是代码,只是表示三个属性之间不变量的方程式。这些方程式还假设您的视图的变换是恒等式,默认情况下是恒等式。如果不是,则 bounds 和 center 保持相同的含义,但 frame 可以改变。除非您进行非直角旋转,否则框架将始终是根据父视图坐标转换的视图。

这里有一个有用的迷你库更详细地解释了这些东西:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-28
      • 2017-01-19
      • 2012-08-07
      • 2012-04-05
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多