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,let
onları 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
.