Belirtilen ve gerekli olan için ortak bir init oluşturuyorum. Kolaylık sağlamak için init(frame:)sıfır çerçevesiyle delege ediyorum .
Sıfır çerçeveye sahip olmak bir sorun değildir çünkü görünüm tipik olarak ViewController görünümünün içindedir; özel görünümünüz, aramaları gözetim altında görüntülediğinde layoutSubviews()veya updateConstraints(). Bu iki işlev, sistem tarafından görünüm hiyerarşisi boyunca yinelemeli olarak çağrılır. Ya kullanabilir updateContstraints()veya layoutSubviews(). updateContstraints()önce denir, sonra layoutSubviews(). Gelen updateConstraints()marka emin süper aramaya son . Olarak layoutSubviews(), süper çağrı ilk .
İşte yaptığım şey:
@IBDesignable
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()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
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
}
}
var. Ancak Swift'deki varsayılan en iyi uygulama,letonları bildirmek için bir neden olmadıkça değişkenleri bildirmektirvar. Dolayısıyla, yukarıdaki kod örneğimde bunu yapmak için böyle bir neden yoktulet.