我写了一个习惯UIView,我发现了一个奇怪的问题.我认为这与一个非常基本的概念有关,但我只是不理解它,感叹.....
class ArrowView: UIView {
override func draw(_ rect: CGRect) {
let arrowPath = UIBezierPath.bezierPathWithArrowFromPoint(startPoint: CGPoint(x:bounds.size.width/2,y:bounds.size.height/3), endPoint: CGPoint(x:bounds.size.width/2, y:bounds.size.height/3*2), tailWidth: 8, headWidth: 24, headLength: 18)
let fillColor = UIColor(red: 0.00, green: 0.59, blue: 1.0, alpha: 1.0)
fillColor.setFill()
arrowPath.fill()
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,但如果我从覆盖绘制函数中抓取这一行,它就不会编译.错误说我不能使用bounds属性.
let arrowPath = UIBezierPath.bezierPathWithArrowFromPoint(startPoint: CGPoint(x:bounds.size.width/2,y:bounds.size.height/3), endPoint: CGPoint(x:bounds.size.width/2, y:bounds.size.height/3*2), tailWidth: 8, headWidth: 24, headLength: 18)
Run Code Online (Sandbox Code Playgroud)
不能在属性初始值设定项中使用实例成员'bounds'; 属性初始化程序在'self'可用之前运行
我不明白为什么我不能在func draw中使用这个界限
Rya*_*los 31
因此,如果我们解码错误消息,您可以弄清楚什么是错误的.它说property initializers run before self is available我们需要调整我们正在做的事情,因为我们的财产依赖于属于自我的界限.让我们尝试一个懒惰的变量.您不能在let中使用bound,因为在创建该属性时它不存在,因为它属于self.所以在init,self还没有完成.但是如果你使用一个懒惰的var,那么self和它的属性边界将在你需要的时候准备就绪.
lazy var arrowPath = UIBezierPath.bezierPathWithArrowFromPoint(startPoint: CGPoint(x: self.bounds.size.width/2,y: self.bounds.size.height/3), endPoint: CGPoint(x: self.bounds.size.width/2, y: self.bounds.size.height/3*2), tailWidth: 8, headWidth: 24, headLength: 18)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22649 次 |
| 最近记录: |