如何在Swift中为UIView子类编写一个自定义的初始化?
假设我想用一个String
和一个Int
init
一个UIView
子类。
我如何做到这一点在Swift中,如果我只是UIView
? 如果我只是做一个自定义的init()
函数,但是参数是一个String和一个Int,它告诉我“super.init()在从初始化程序返回之前不被调用”。
如果我打电话super.init()
我告诉我必须使用指定的初始值设定项。 我应该在那里使用什么? 帧版本? 编码器版本? 都? 为什么?
init(frame:)
版本是默认的初始化程序。 只有在初始化实例variables后才能调用它。 如果这个视图是从一个Nib重构的,那么你的自定义初始化器将不会被调用,而是调用init?(coder:)
版本。 由于Swift现在需要执行所需的init?(coder:)
,所以我更新了下面的例子,并将let
variables声明更改为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 } }