Я створюю загальну ініціативу для призначених і потрібних. Для зручності inits я делегую 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.