Компоновочные анкеры в Свифт 4
Я пытаюсь обновить / упростить мой код, относящийся к Auto Layout против NSConstraints, однако, похоже, пока что это сбивает меня с толку.
У меня есть некоторый код Swift 3, который скользит в UIView по нажатию кнопки, однако UIView контролируется NSconstraints и работает нормально. -
@IBAction func rightFlyOutButton(_ sender: Any) {
if (rightFlyOutShowing) {
if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad {
leftFlyOutLeadingConstraint.constant = 25
} else {
leftFlyOutLeadingConstraint.constant = 15
}
rightFlyOutTrailingConstraint.constant = rightFlyOut.frame.width * 0.93
UIView.animate(withDuration: 0.4, animations: {self.view.layoutIfNeeded()})
} else {
if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad {
rightFlyOutTrailingConstraint.constant = 25
} else {
rightFlyOutTrailingConstraint.constant = 15
}
UIView.animate(withDuration: 0.4, animations: {self.view.layoutIfNeeded()})
}
rightFlyOutShowing = !rightFlyOutShowing
}
Пытаясь использовать AutoLayout и Layout Anchors, я придумываю это -
@IBAction func rightFlyOutButton(_ sender: Any) {
rightFlyOut.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
rightFlyOut.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.93).isActive = true
UIView.animate(withDuration: 0.4, animations: {self.view.layoutIfNeeded()})
}
Это возвращает множество ошибок -
[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.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSAutoresizingMaskLayoutConstraint:0x6000000949b0 h=-&& v=-&& FasteM.UIViewX:0x7fed7140c600.width == 0.500741*UIView:0x7fed7161d760.width + 150.222 (active)>",
"<NSLayoutConstraint:0x6000000900e0 FasteM.UIViewX:0x7fed7140c600.width == 0.93*UIView:0x7fed7161d760.width (active)>",
"<NSLayoutConstraint:0x600000095a90 'UIView-Encapsulated-Layout-Width' UIView:0x7fed7161d760.width == 375 (active)>"
)
Моя логика в том, что я привязываю правый край представления к суперпредставлению и определяю ширину фактического вида (т.е. 93% суперпредставления).
Я уверен, что это простая ошибка, которую я пропускаю, но я был бы признателен за любые указатели в правильном направлении.
ТИА
2 ответа
Проблема со вторым подходом состоит в том, что для каждого щелчка он создает другие ограничения, которые создают конфликт со старыми теми же самыми, поэтому вы должны создавать эти ограничения в любом месте, получать ссылку на них и изменять их константы, как вы делали в первом правильный подход
Я имел дело с этой проблемой и, наконец, нашел рабочее решение -
Сначала создайте переменную:
var LeftFlyOutConstraint: NSLayoutConstraint?
Затем используйте следующий код в viewDidLoad():
leftFlyOut.translatesAutoresizingMaskIntoConstraints = false
LeftFlyOutConstraint = leftFlyOut.trailingAnchor.constraint(equalTo: view.leadingAnchor, constant: 35)
LeftFlyOutConstraint?.isActive = true
И наконец кнопка:
@IBAction func leftFlyOutButton(_ sender: Any) {
if (leftFlyOutShowing) {
LeftFlyOutConstraint?.isActive = false
LeftFlyOutConstraint = leftFlyOut.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -40)
LeftFlyOutConstraint?.isActive = true
UIView.animate(withDuration: 0.4, animations: {self.view.layoutIfNeeded()})
} else {
LeftFlyOutConstraint?.isActive = false
LeftFlyOutConstraint = leftFlyOut.trailingAnchor.constraint(equalTo: view.leadingAnchor, constant: 35)
LeftFlyOutConstraint?.isActive = true
UIView.animate(withDuration: 0.4, animations: {self.view.layoutIfNeeded()})
}
leftFlyOutShowing = !leftFlyOutShowing
}
И нет сообщений об ошибках.