我正在用swift编写一个程序,刚才我注意到我可以直接访问CGRect
帧的宽度和高度属性而不使用CGSize
宽度和高度。那就是我现在能够编写这样的代码。
@IBOutlet var myView: UIView!
override func viewDidLoad()
{
super.viewDidLoad()
var height = myView.frame.height
var height1 = myView.frame.size.height
}
在Objective C中,当我尝试编写相同的代码时,行height = view.frame.height
会抛出错误。任何人都可以告诉我这两行代码中的区别(如果有的话)。
答案 0 :(得分:23)
我刚看了CGRect
结构参考。在Swift中,定义了一个扩展名,其中包含成员height
和width
。请看下面的代码
struct CGRect {
var origin: CGPoint
var size: CGSize
}
extension CGRect {
...
var width: CGFloat { get }
var height: CGFloat { get }
...
}
这样您就可以直接从height
获取width
和CGRect
值。如您所见,这些仅为getters
,因此如果您尝试使用view.frame.height = someValue
设置这些值,则会出现错误
答案 1 :(得分:1)
frame
属CGRect
结构,除了width
和height
只有getters
,它们只能正。来自文档:
无论高度是作为正数还是负数存储在CGRect数据结构中,此函数都会返回高度,就好像矩形是标准化的一样。也就是说,结果永远不会是负数。
但是,size
具有CGSize
结构,来自文档:
CGSize结构有时用于表示距离向量,而不是物理大小。作为向量,其值可以是负。要规范化CGRect结构以使其大小由正值表示,请调用标准化函数。
所以区别很明显。
答案 2 :(得分:1)
在Objective C中,当我尝试编写相同的代码时,行
height = view.frame.height
会抛出错误。任何人都可以告诉我这两行代码中的区别(如果有的话)。
CGGeometry.h定义了几种类型,其中包括C struct CGRect
。这个结构有两个成员:origin和size。
您可以使用点表示法在C(和Objective-C)中访问所有内容。 C和Objective-C都没有为结构提供扩展。
Swift将该类型作为Swift结构导入。区别在于Swift 确实允许对结构进行扩展。因此它将几个免费的C函数公开为扩展:
CGRectGetMinX() — CGRect.minX
CGRectGetMidX() — CGRect.midX
CGRectGetMaxX() — CGRect.maxX
CGRectGetWidth() — CGRect.width
[... same for y]
这些C函数自那时起就存在 - 它们只是生活在CoreGraphics的尘土飞扬的角落里。
它们非常有用,但您必须知道它们的语义(与标准访问器略有不同):它们将尺寸标准化。
这意味着他们将带有负宽度或高度的矩形转换为覆盖具有正尺寸和偏移原点的相同区域的矩形。
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