跳到主要内容

解释Object-C frame 和 bounds 的异同 ?

参考答案:

在 Objective-C 中,尤其是在 UIKit 框架中,framebounds 是两个常用的属性,它们都与视图的几何位置和大小有关,但有着不同的含义和用途。

Frame

frame 属性定义了一个视图在其父坐标系中的位置和大小。它是一个 CGRect 结构体,包含了 xywidthheight 四个属性,分别表示视图左上角的 x 坐标、y 坐标以及视图的宽度和高度。

  • xy:表示视图左上角在其父视图坐标系中的位置。
  • widthheight:表示视图的宽度和高度。

Bounds

bounds 属性定义了一个视图在其自身坐标系中的位置和大小。它也是一个 CGRect 结构体,通常 boundsxy 坐标都是 (0, 0),因为它们是相对于视图自身的左上角来计算的。

  • xy:对于 bounds,通常这两个值都是 0,表示视图的左上角是其自身坐标系的原点。
  • widthheight:表示视图的宽度和高度,与 frame 中的 widthheight 相同。

异同

相同点

  • framebounds 都是 CGRect 结构体,包含了视图的位置和大小信息。
  • 它们的 widthheight 属性表示的是视图的宽度和高度,这两个属性在 framebounds 中是相同的。

不同点

  • 坐标系不同frame 是相对于父视图坐标系来定义的,而 bounds 是相对于视图自身坐标系来定义的。
  • 用途不同frame 主要用于在父视图中定位子视图,而 bounds 则更多用于定义视图自身的绘制区域和内容布局。
  • 变换影响:当对视图应用仿射变换(如旋转或缩放)时,frame 的值可能会发生变化,但 bounds 通常保持不变。这是因为 bounds 是相对于视图自身的,而变换是应用于视图的整体的。

示例

假设你有一个父视图,其尺寸为 (300, 300),现在你在这个父视图中添加一个子视图,其 frame 设置为 (50, 50, 100, 100)。这意味着子视图的左上角位于父视图的 (50, 50) 位置,子视图的尺寸为 (100, 100)。而子视图的 bounds 通常会是 (0, 0, 100, 100),表示在其自身坐标系中,内容从 (0, 0) 开始,并且占据整个视图的区域。