14

我正在快速编写一个程序,刚才我注意到我可以直接访问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抛出错误。谁能告诉我这两行代码的区别(如果有的话)。

4

3 回答 3

29

我只是查看了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

于 2014-12-02T07:17:51.407 回答
1

frame是有CGRect结构的,除了它的widthheight有的getters,它们只能是的。从文档中:

无论高度是作为正数还是负数存储在 CGRect 数据结构中,此函数都会返回高度,就好像矩形是标准化的一样。也就是说,结果永远不是负数。

但是,从文档中可以看出sizeCGSize

CGSize 结构有时用于表示距离向量,而不是物理大小。作为一个向量,它的值可以是负数。要规范化 CGRect 结构以使其大小由正值表示,请调用标准化函数。

所以区别很明显。

于 2017-07-15T15:41:58.573 回答
1

在 Objective C 中,当我尝试编写相同的代码时,该行height = view.frame.height抛出错误。谁能告诉我这两行代码的区别(如果有的话)。

CGGeometry.h 定义了几种类型,其中包括 C struct CGRect。这个结构有两个成员:原点和大小。

这就是您可以使用点符号在 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
于 2017-09-28T20:44:10.703 回答