Я создаю общий 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.