我只是尝试将两个var设置为视图的bounds.size.width和.height。
import UIKit
class BKView: UIView {
var maxX: CGFloat = bounds.size.width
var maxY: CGFloat = bounds.size.height
}
然而Xcode没有说错误:'BKView.Type'没有名为'bounds'的成员。
有什么建议吗?
答案 0 :(得分:4)
这是一个措辞严重的编译器错误,但它意味着你不能根据类(或超类)的其他属性给出属性默认值。以下是正在发生的事情的简单变体:
class A {
let x: Int
init(x: Int) {
self.x = x
}
}
class B: A {
// error: 'B.Type' does not have a member named 'x'
let y = x
}
在调用maxX
之后,您必须在maxY
方法中初始化init
和super.init
(因为只有在此之后才允许您访问{{1}}超类的属性)。
答案 1 :(得分:2)
@Airspeed Velocity给出了一个很好的解释。我想添加它,或者你可以使用lazy
初始化。例如:
class BKView: UIView {
lazy var maxX: CGFloat = self.bounds.size.width
lazy var maxY: CGFloat = self.bounds.size.height
}
有关详细信息,请参阅:http://mikebuss.com/2014/06/22/lazy-initialization-swift/
答案 2 :(得分:1)
创建视图时,需要定义一些默认的初始化方法。按如下方式定义一个类:
class TestView: UIView {
var maxX : CGFloat?
var maxY : CGFloat?
override init() {
super.init()
initializeBounds()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initializeBounds()
}
override init(frame: CGRect) {
super.init(frame: frame)
initializeBounds()
}
func initializeBounds()
{
maxX = self.bounds.size.width
maxY = self.bounds.size.height
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
println("maxX: \(maxX!) maxY: \(maxY!)")
}
}
每当Storyboard或Coding初始化TestView
时,TestView
的属性都会被初始化。
将视图添加到视图控制器的视图后,如下所示:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var testView : TestView = TestView(frame: CGRectMake(10.0, 10.0, 100.0, 50.0))
testView.backgroundColor = UIColor.redColor()
self.view.addSubview(testView)
}
日志如下:
TestView:maxX:100.0 maxY:50.0
为避免代码复制,initializeBounds()
在TestView
的初始值设定项中定义并调用:
答案 3 :(得分:0)
使用self.bounds.size.width
和self.bounds.size.height
。您应该在初始值设定项或其他函数中指定属性maxX
和maxY
值,而不是内联。例如:
init(frame: CGRect) {
super.init(frame: frame)
maxX = self.bounds.size.width
maxY = self.bounds.size.height
}