如何在Swift中为UIView子类编写一个自定义的初始化?

假设我想用一个String和一个Int init一个UIView子类。

我如何做到这一点在Swift中,如果我只是UIView ? 如果我只是做一个自定义的init()函数,但是参数是一个String和一个Int,它告诉我“super.init()在从初始化程序返回之前不被调用”。

如果我打电话super.init()我告诉我必须使用指定的初始值设定项。 我应该在那里使用什么? 帧版本? 编码器版本? 都? 为什么?

init(frame:)版本是默认的初始化程序。 只有在初始化实例variables后才能调用它。 如果这个视图是从一个Nib重构的,那么你的自定义初始化器将不会被调用,而是调用init?(coder:)版本。 由于Swift现在需要执行所需的init?(coder:) ,所以我更新了下面的例子,并将letvariables声明更改为var和optional。 在这种情况下,你可以在awakeFromNib()或稍后的时间初始化它们。

 class TestView : UIView { var s: String? var i: Int? init(s: String, i: Int) { self.s = s self.i = i super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } } 

下面是我在Swift上如何在IOS 9上做的 –

 import UIKit class CustomView : UIView { init() { super.init(frame: UIScreen.mainScreen().bounds); //for debug validation self.backgroundColor = UIColor.blueColor(); print("My Custom Init"); return; } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented"); } } 

这是一个完整的项目,例如:

  • UIView示例项目(使用SubView示例)

这里是我如何在Swift上做IOS的子视图 –

 class CustomSubview : UIView { init() { super.init(frame: UIScreen.mainScreen().bounds); let windowHeight : CGFloat = 150; let windowWidth : CGFloat = 360; self.backgroundColor = UIColor.whiteColor(); self.frame = CGRectMake(0, 0, windowWidth, windowHeight); self.center = CGPoint(x: UIScreen.mainScreen().bounds.width/2, y: 375); //for debug validation self.backgroundColor = UIColor.grayColor(); print("My Custom Init"); return; } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented"); } } 

我为指定的和必需的创build了一个通用的init。 为了方便,我将其委托给init(frame:) ,框架为零。

零框架不是一个问题,因为通常视图是在一个ViewController的视图。 superview调用layoutSubviews()updateConstraints() ,由系统在整个视图层次结构中recursion调用。

如果您的自定义视图具有子视图,则可以在updateContstraints()layoutSubviews()设置子视图的框架。 首先调用updateContstraints() ,然后调用layoutSubviews() 。 在updateConstraints()确保最后调用super。 在layoutSubviews() ,先调用super。

这就是我所做的:

 class MyView: UIView { convenience init(args: Whatever) { self.init(frame: CGRect.zero) //assign custom vars } override init(frame: CGRect) { super.init(frame: frame) commonInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() } private func commonInit() { //custom initialization } override func updateConstraints() { //set subview constraints here super.updateConstraints() } override func layoutSubviews() { super.layoutSubviews() //manually set subview frames here } }