frame.size.width和frame.width之间的区别
我正在写一个快速的程序,现在我注意到我可以直接访问一个CGRect
框架的宽度和高度属性,而不使用CGSize
宽度和高度。 那是我现在能够写这样的代码。
@IBOutlet var myView: UIView! override func viewDidLoad() { super.viewDidLoad() var height = myView.frame.height var height1 = myView.frame.size.height }
在Objective C中,当我试图编写相同的代码时,line height = view.frame.height
会引发错误。 任何人都可以告诉我这两行代码的区别(如果有的话)。
我只是看着CGRect
结构的参考。 在Swift中,定义了一个扩展名,其中包含成员的height
和width
。 请看下面的代码
struct CGRect { var origin: CGPoint var size: CGSize } extension CGRect { ... var width: CGFloat { get } var height: CGFloat { get } ... }
所以你可以直接从CGRect
获取height
和width
值。 正如你可以看到这些只是getters
,所以你会得到一个错误,如果你尝试使用view.frame.height = someValue
设置这些值
frame
是CGRect
结构,除了它的width
和height
只有getters
,它们只能是正面的 。 从文档:
无论高度是作为正数还是负数存储在CGRect数据结构中,该函数都返回高度,就好像矩形被标准化了一样。 也就是说,结果绝不是负数。
但是, size
是CGSize
结构,从文档:
CGSize结构有时用来表示一个距离vector ,而不是物理大小。 作为一个向量,它的值可能是负的 。 为了使CGRect结构标准化,使其大小由正值表示,请调用标准化函数。
所以差异是显而易见的。
在Objective C中,当我试图编写相同的代码时,line
height = view.frame.height
会引发错误。 任何人都可以告诉我这两行代码的区别(如果有的话)。
CGGeometry.h定义了几个types,其中包括C struct CGRect
。 这个结构有两个成员:起源和大小。
这就是你可以使用点符号在C(和Objective-C)中访问的全部内容。 C和Objective-C都不提供对结构的扩展。
Swift将该types作为Swift结构导入。 不同的是,Swift允许在结构上进行扩展。 所以它公开了几个免费的C函数作为扩展:
CGRectGetMinX() — CGRect.minX CGRectGetMidX() — CGRect.midX CGRectGetMaxX() — CGRect.maxX CGRectGetWidth() — CGRect.width [... same for y]
这些C函数自古以来就存在 – 它们只是生活在CoreGraphics的一个尘土飞扬的angular落。
它们是非常有用的,但是你必须知道它们的语义(与标准访问器有所不同):它们规范了尺寸。
这意味着它们将具有负宽度或高度的矩形转换为包含具有正大小和偏移原点的相同区域的矩形。
let rect = CGRect(x: 0, y: 0, width: 10, height: -10) assert(rect.width == rect.size.width) // OK assert(rect.height == rect.size.height) // boom