UIView中frame.height与frame.size.height的区别及size属性意义咨询
嘿,这个问题问得特别好,刚好戳中了UIKit布局里的一个实用小细节,我来给你唠明白~
UIView的frame.height与frame.size.height:其实没区别!
首先得说清楚,frame是一个CGRect类型的结构体,苹果为了让我们写代码更省心,给CGRect加了几个「快捷访问属性」——height就是其中一个,它的内部实现直接返回size.height的值。换句话说,这两种写法在功能上完全等价,只是前者更简洁而已。
举个代码例子就懂了:
// Swift里这两行代码输出的结果一模一样 let viewHeight1 = myView.frame.height let viewHeight2 = myView.frame.size.height
OC里也是同样的逻辑:
// OC中这两行也完全等价 CGFloat viewHeight1 = myView.frame.height; CGFloat viewHeight2 = myView.frame.size.height;
你可以把frame.height理解成苹果给我们的语法糖,省去了写.size的步骤,让代码更清爽。
为什么要单独设置size属性?这是CGRect的设计巧思!
要搞懂这个,得先明白CGRect的结构:它是由origin(一个CGPoint,管视图的位置)和size(一个CGSize,管视图的宽高)两个独立的小结构体组成的。把位置和尺寸拆分开,主要有这两个好处:
- 逻辑更清晰:布局时,「移动视图」和「调整视图大小」是两个完全独立的操作。比如你只想把视图拉长但不想挪它的位置,直接改
frame.size.height(或者frame.height)就好;如果想把视图挪到另一个地方但大小不变,就改frame.origin。这种拆分让代码的意图一目了然,别人看你的代码时,一眼就知道你是要改位置还是改尺寸。 - 复用性更强:
CGSize可以单独拿出来复用。比如你要做一组尺寸完全相同的按钮,先定义一个通用尺寸,再给每个按钮的frame.size赋值就行,后续要统一修改按钮大小,只需要改这个通用尺寸就好,不用一个个去调每个按钮的宽高。
举个实际开发中的例子:
// 定义一个通用的卡片尺寸 var cardSize = CGSize(width: 280, height: 180) // 创建第一个卡片,位置在左上角 let card1 = UIView(frame: CGRect(origin: CGPoint(x: 20, y: 40), size: cardSize)) // 创建第二个卡片,位置在第一个卡片下方 let card2 = UIView(frame: CGRect(origin: CGPoint(x: 20, y: 240), size: cardSize)) // 后来产品说要把卡片改宽一点,只需要改cardSize,再重新赋值给两个卡片的size即可 cardSize = CGSize(width: 300, height: 180) card1.frame.size = cardSize card2.frame.size = cardSize
你看,这样是不是比分别修改每个卡片的frame.width要高效得多?而且如果后续还要加更多卡片,直接复用cardSize就行,不用重复写宽高数值,减少出错的概率。
另外,除了frame,UIView的bounds属性里也有size——这个size管的是视图自身坐标系的尺寸,比如你给视图加子视图时,子视图的位置就是基于bounds.origin和bounds.size来计算的,这也能看出拆分位置和尺寸的设计有多实用。
内容的提问来源于stack exchange,提问作者alvin123
相关产品推荐
相关产品推荐

