Я пытаюсь полностью сделать свой взгляд программным. Он имеет вид снизу, который оживляет, когда поисковый запрос заканчивается соответствующей информацией. Я установил .bottom nslayoutstraint нижнего представления на необязательный nslayoutconstraint, сначала инициализируя его с экрана в переопределении func viewWillLayoutSubviews().Как обновить константы NSLayoutConstraint, которые ранее были установлены в коде? - Swift
let bottomView = UIView()
var bottomViewBottomConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(bottomView)
}
override func viewWillLayoutSubviews() {
//Bottom View Constraints
bottomView.translatesAutoresizingMaskIntoConstraints = false
let bottomViewLeftConstraint = NSLayoutConstraint(item: bottomView, attribute: .left, relatedBy: .equal, toItem: view, attribute: .left, multiplier: 1, constant: 0)
let bottomViewRightConstraint = NSLayoutConstraint(item: bottomView, attribute: .right, relatedBy: .equal, toItem: view, attribute: .right, multiplier: 1, constant: 0)
let bottomViewHeightConstraint = NSLayoutConstraint(item: bottomView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 75)
bottomViewBottomConstraint = NSLayoutConstraint(item: self.bottomView, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 100)
NSLayoutConstraint.activate([
bottomViewLeftConstraint, bottomViewRightConstraint, bottomViewBottomConstraint, bottomViewHeightConstraint
])
}
Вид появляется после завершения поискового запроса.
self.view.layoutIfNeeded()
UIView.animate(withDuration: 0.8, delay: 1, usingSpringWithDamping: 1, initialSpringVelocity: 0.1, options: .curveEaseIn, animations: {
self.bottomViewBottomConstraint.constant = -5
self.view.layoutIfNeeded()
}, completion: nil)
Однако после этого момента, когда я пытаюсь закрыть вид и изменить NsLayoutConstraint постоянным, вид не двигается.
self.view.layoutIfNeeded()
UIView.animate(withDuration: 0.8, animations: {
self.bottomViewBottomConstraint.constant = 100
self.view.layoutIfNeeded()
})
В выходной консоли я получаю эту ошибку, и я не уверен, как ее исправить.
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2016-10-11 14:50:01.768353 Green Homes Australia[973:232019] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x17028d6b0 UIView:0x1049365b0.bottom == UIView:0x100b04e40.bottom - 5 (active)>",
"<NSLayoutConstraint:0x174681cc0 UIView:0x1049365b0.bottom == UIView:0x100b04e40.bottom + 100 (active)>")
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x174681cc0 UIView:0x1049365b0.bottom == UIView:0x100b04e40.bottom + 100 (active)>
Спасибо, ваш спасатель, думал, что он работает только во время работы. –
Я имел такой же эффект и разрешение даже при загрузке ограничений в пользовательском методе 'setup()'. Подклассы моих классов переопределяли метод и вызывали 'super.setup()', которые повторно загружали ограничение с несогласованными значениями. Решено, установив мой метод настройки начальной загрузки в 'private', устраняя несколько вызовов. – Stan