2016-10-11 6 views
0

Я пытаюсь полностью сделать свой взгляд программным. Он имеет вид снизу, который оживляет, когда поисковый запрос заканчивается соответствующей информацией. Я установил .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)> 

ответ

0

Проблема заключается в том, что ваши

override func viewWillLayoutSubviews() { 

работает снова и снова и снова. Макет происходит много! Таким образом, эти ограничения все создаются и добавляются снова и снова, включая после, вы сделали анимацию и изменили нижнее ограничение. Таким образом, вы получаете два противоречивых нижних ограничения. (Вы на самом деле есть лотов донного ограничений, но все остальные равны одному из конфликтующих ограничений, поэтому во время выполнения не жалуется.)

Простое решение, которое я хотел бы использовать это поставить логическое чтобы моя первоначальная конфигурация выполнялась только один раз:

var didConfig = false 
override func viewWillLayoutSubviews() { 
    if !didConfig { 
     didConfig = true 
     // create and configure constraints here 
    } 
} 
+0

Спасибо, ваш спасатель, думал, что он работает только во время работы. –

+0

Я имел такой же эффект и разрешение даже при загрузке ограничений в пользовательском методе 'setup()'. Подклассы моих классов переопределяли метод и вызывали 'super.setup()', которые повторно загружали ограничение с несогласованными значениями. Решено, установив мой метод настройки начальной загрузки в 'private', устраняя несколько вызовов. – Stan