frame.size.width和frame.width之间的区别

时间:2014-12-02 06:48:41

标签: ios swift xcode6 cgrect cgsize

我正在用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会抛出错误。任何人都可以告诉我这两行代码中的区别(如果有的话)。

3 个答案:

答案 0 :(得分:23)

我刚看了CGRect结构参考。在Swift中,定义了一个扩展名,其中包含成员heightwidth。请看下面的代码

struct CGRect {
var origin: CGPoint
var size: CGSize
}

extension CGRect {
    ...
    var width: CGFloat { get }
    var height: CGFloat { get }
    ...
}

这样您就可以直接从height获取widthCGRect值。如您所见,这些仅为getters,因此如果您尝试使用view.frame.height = someValue设置这些值,则会出现错误

答案 1 :(得分:1)

frameCGRect结构,除了widthheight只有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