Saya membuat init umum untuk yang ditunjuk dan diperlukan. Untuk kemudahan saya mendelegasikan init(frame:)
dengan bingkai nol.
Memiliki nol frame bukanlah masalah karena biasanya view berada di dalam viewController's view; tampilan ubahsuaian Anda akan mendapatkan kesempatan yang baik dan aman untuk mengatur tampilan bawahnya saat panggilan superview layoutSubviews()
atau updateConstraints()
. Dua fungsi ini dipanggil oleh sistem secara rekursif di seluruh hierarki tampilan. Anda dapat menggunakan salah satu updateContstraints()
atau layoutSubviews()
. updateContstraints()
disebut pertama, lalu layoutSubviews()
. Dalam updateConstraints()
make pastikan untuk panggilan super lalu . Di layoutSubviews()
, panggil super dulu .
Inilah yang saya lakukan:
@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
. Tetapi praktik terbaik default di Swift adalah mendeklarasikan variabellet
kecuali ada alasan untuk mendeklarasikannyavar
. Karena itu, tidak ada alasan untuk melakukannya dalam contoh kode saya di ataslet
.