解释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) 开始,并且占据整个视图的区域。