【问题标题】:Difference between frame.size.width and frame.widthframe.size.width 和 frame.width 的区别
【发布时间】:2014-12-02 06:48:41
【问题描述】:

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

【问题讨论】:

    标签: ios swift xcode6 cgrect cgsize


    【解决方案1】:

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

    struct CGRect {
    var origin: CGPoint
    var size: CGSize
    }
    
    extension CGRect {
        ...
        var width: CGFloat { get }
        var height: CGFloat { get }
        ...
    }
    

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

    【讨论】:

    • 感谢您的信息。你能给我一个链接,我可以在哪里找到这个参考。我检查了文档,但在任何地方都没有看到这个扩展:/
    • 按住Command 键并将Class/Variable 悬停然后点击它。
    【解决方案2】:

    frameCGRect结构,除了widthheight只有getters,它们只能是。来自文档:

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

    但是,sizeCGSize 结构,来自文档:

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

    所以区别很明显。

    【讨论】:

      【解决方案3】:

      在 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        • 2011-10-20
        • 2020-01-23
        • 1970-01-01
        • 2017-11-12
        • 1970-01-01
        • 2014-10-09
        相关资源
        最近更新 更多