Tôi tạo một init chung cho chỉ định và yêu cầu. Để thuận tiện, tôi ủy thác init(frame:)
với khung bằng không.
Có khung bằng 0 không phải là vấn đề vì thông thường chế độ xem nằm trong chế độ xem của ViewContoder; chế độ xem tùy chỉnh của bạn sẽ có cơ hội tốt, an toàn để bố trí các cuộc phỏng vấn của nó khi giám sát của nó gọi layoutSubviews()
hoặc updateConstraints()
. Hai hàm này được hệ thống gọi đệ quy trong toàn bộ phân cấp khung nhìn. Bạn có thể sử dụng updateContstraints()
hoặc layoutSubviews()
. updateContstraints()
được gọi đầu tiên, sau đó layoutSubviews()
. Trong updateConstraints()
chắc chắn để gọi siêu cuối cùng . Trong layoutSubviews()
, gọi siêu đầu tiên .
Đây là những gì tôi làm:
@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
. Nhưng thực tế tốt nhất mặc định trong Swift là khai báo các biếnlet
trừ khi có lý do để khai báo chúngvar
. Do đó, không có lý do nào để làm như vậy trong ví dụ mã của tôi ở trênlet
.