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