Я создаю общий init для обозначенных и требуемых. Для удобства я передаю его init(frame:)
с нулевым кадром.
Наличие нулевого кадра не является проблемой, потому что обычно представление находится внутри представления ViewController; ваше настраиваемое представление получит хороший и безопасный шанс разместить свои подвиды, когда его супервизор вызывает layoutSubviews()
или updateConstraints()
. Эти две функции вызываются системой рекурсивно по всей иерархии представлений. Вы можете использовать либо, updateContstraints()
либо layoutSubviews()
. updateContstraints()
сначала вызывается, затем layoutSubviews()
. В updateConstraints()
Обязательно позовите супер последний . Во- первыхlayoutSubviews()
, позвони супер .
Вот что я делаю:
@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
. Но лучшая практика по умолчанию в Swift - объявлять переменные,let
если нет причины для их объявленияvar
. Следовательно, в моем примере кода выше не было такой причиныlet
.