我试图以编程方式完全表达我的观点。它具有一个底视图,当搜索查询完成相关信息后,该视图会呈现动画效果。我已将底部视图的.bottom nslayoutconstraint设置为可选的nslayoutconstraint,首先在屏幕上使用覆盖函数func viewWillLayoutSubviews()对其进行了初始化。

    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)>

最佳答案

问题是你

override func viewWillLayoutSubviews() {


一次又一次地运行。布局经常发生!因此,所有这些约束都会一次创建并添加一次,包括在完成动画并更改底部约束之后。因此,您最终遇到了两个相互矛盾的底部约束。 (您实际上有很多底部约束,但是所有其他约束都等于冲突的约束之一,因此运行时不会抱怨。)

我喜欢使用的一个简单解决方案是放置一个布尔标志,以便我的初始配置仅发生一次:

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

10-08 05:51
查看更多