解释Object-C frame 和 bounds 的异同 ?
参考答案:
在 Objective-C 中,尤其是在 UIKit 框架中,frame
和 bounds
是两个常用的属性,它们都与视图的几何位置和大小有关,但有着不同的含义和用途。
Frame
frame
属性定义了一个视图在其父坐标系中的位置和大小。它是一个 CGRect
结构体,包含了 x
、y
、width
和 height
四个属性,分别表示视图左上角的 x 坐标、y 坐标以及视图的宽度和高度。
x
和y
:表示视图左上角在其父视图坐标系中的位置。width
和height
:表示视图的宽度和高度。
Bounds
bounds
属性定义了一个视图在其自身坐标系中的位置和大小。它也是一个 CGRect
结构体,通常 bounds
的 x
和 y
坐标都是 (0, 0)
,因为它们是相对于视图自身的左上角来计算的。
x
和y
:对于bounds
,通常这两个值都是 0,表示视图的左上角是其自身坐标系的原点。width
和height
:表示视图的宽度和高度,与frame
中的width
和height
相同。
异同
相同点
frame
和bounds
都是CGRect
结构体,包含了视图的位置和大小信息。- 它们的
width
和height
属性表示的是视图的宽度和高度,这两个属性在frame
和bounds
中是相同的。
不同点
- 坐标系不同:
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)
开始,并且占据整个视图的区域。