У меня есть подкласс UIview, ограничения которого зависят от границ его суперпредставления.
В приведенном примере, когда мои пользовательские UIviews инициализируются из Interface Builder, все позиционируется, как и ожидалось. Однако, когда он программно инициализируется из viewController, подпредставления устанавливаются до суперпредставления, а их ограничения игнорируются.
Есть ли способ инициализировать или обновить макет подпредставлений, когда известны границы суперпредставления?
class CustomView: UIView {
let firstSubview = UIView()
let secondSubview = UIView()
override init(frame: CGRect) {
super.init(frame: frame)
initialization()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialization()
}
func initialization() {
firstSubview.backgroundColor = UIColor.black
addSubview(firstSubview)
firstSubview.translatesAutoresizingMaskIntoConstraints = false
firstSubview.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 20).isActive = true
//....other autoLayout constraints for trailing, top and bottom anchors
secondSubview.backgroundColor = UIColor.blue
addSubview(secondSubview)
secondSubview.translatesAutoresizingMaskIntoConstraints = false
secondSubview.leadingAnchor.constraint(equalTo:self.leadingAnchor, constant: 20).isActive = true
//....other autoLayout constraints for trailing, top and bottom anchors
}
}
вот viewController
class ViewController: UIViewController {
let firstCustomView = CustomView(frame: CGRect.zero)
@IBOutlet weak var secondCustomView UIView! //working with autoLayout constraints from IB
override func viewDidLoad() {
super.viewDidLoad()
firstCustomView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(firstCustomView)
firstCustomView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30)
firstCustomView.topAnchor.constraint(equalTo: view.topAnchor, constant: 200)
firstCustomView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30)
firstCustomView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200)
}
}
EDIT:
Вот рабочий код с правильной активацией ограничений благодаря комментариям и помощи @ Sulthan.
override func viewDidLoad() {
super.viewDidLoad()
firstCustomView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(firstCustomView).isActive = true
firstCustomView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30).isActive = true
firstCustomView.topAnchor.constraint(equalTo: view.topAnchor, constant: 200).isActive = true
firstCustomView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
firstCustomView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200).isActive = true
}