在 UIView 的 let 语句中引用 self.frame

Referencing self.frame in let statements in UIView

在 ObjC 中,对于 iOS,我曾经在 class 文件的顶部使用一堆 #define 语句来设置视图布局的常量。通常,他们引用 self.frame。我正在尝试对 Swift 中的 let 语句做同样的事情,它不会让我在任何地方使用 self.frame。我收到错误消息是因为找不到 frame 属性:

import UIKit

class MySubview: UIView {

    /* Constants */
    let frameX = (self.frame.origin.x) // error
    let frameY = (self.frame.origin.y) // error
    let frameW = (self.frame.size.width) // error 
    let frameH = (self.frame.size.height) // error
    // ...
}

为什么抱怨?我是 subclassing UIView,所以 属性 应该在那里。我该如何解决这个问题?

你所拥有的实际上不是常量,因为框架可以改变。常量属性(使用let)的值在允许访问self之前的初始化阶段设置,并且不能更改。

在你的情况下,你应该使用 computed properties:

class MySubview: UIView {
    var frameX: CGFloat { return frame.minX }
    var frameY: CGFloat { return frame.minY }
    var frameW: CGFloat { return frame.width }
    var frameH: CGFloat { return frame.height }
    // ...
}

此外,请注意 Swift 中 CGRect 上更方便的方法,这可能会使其中一些方便的变量有些多余。