在 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
上更方便的方法,这可能会使其中一些方便的变量有些多余。
在 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
上更方便的方法,这可能会使其中一些方便的变量有些多余。