我具有以下约束的视图设置:

 bottomContainerViewConstraint = NSLayoutConstraint(item: containerView, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1, constant: -10)
    self.view.addConstraint(bottomContainerViewConstraint!)
    topContainerViewConstraint = NSLayoutConstraint(item: containerView, attribute: .Leading, relatedBy: .Equal, toItem: self.view, attribute: .Leading, multiplier: 1, constant: 10)
    self.view.addConstraint(topContainerViewConstraint!)
    self.view.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Trailing, relatedBy: .Equal, toItem: self.view, attribute: .Trailing, multiplier: 1, constant: -10))
    self.view.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1, constant: -120))

    //caption and profilepic constraints

    self.view.addConstraint(NSLayoutConstraint(item: captionAndProfileImageContainerView, attribute: .Top, relatedBy: .Equal, toItem: containerView, attribute: .Top, multiplier: 1, constant: 0))
    self.view.addConstraint(NSLayoutConstraint(item: captionAndProfileImageContainerView, attribute: .Leading, relatedBy: .Equal, toItem: containerView, attribute: .Leading, multiplier: 1, constant: 0))
    self.view.addConstraint(NSLayoutConstraint(item: captionAndProfileImageContainerView, attribute: .Trailing, relatedBy: .Equal, toItem: containerView, attribute: .Trailing, multiplier: 1, constant: -110))
    self.view.addConstraint(NSLayoutConstraint(item: captionAndProfileImageContainerView, attribute: .Bottom, relatedBy: .Equal, toItem: containerView, attribute: .Bottom, multiplier: 1, constant: 0))

    self.view.addConstraintsWithFormat("H:|-8-[v0(50)]", views: profilePicImageView)
    self.view.addConstraintsWithFormat("V:|-30-[v0(50)]", views: profilePicImageView)
    profilePicImageView.layer.cornerRadius = 25
    profilePicImageView.layer.masksToBounds = true



    self.view.addConstraint(NSLayoutConstraint(item: captionTextView, attribute: .Top, relatedBy: .Equal, toItem: captionAndProfileImageContainerView, attribute: .Top, multiplier: 1, constant: 0))
    self.view.addConstraint(NSLayoutConstraint(item: captionTextView, attribute: .Leading, relatedBy: .Equal, toItem: profilePicImageView, attribute: .Trailing, multiplier: 1, constant: 8))
    self.view.addConstraint(NSLayoutConstraint(item: captionTextView, attribute: .Trailing, relatedBy: .Equal, toItem: captionAndProfileImageContainerView, attribute: .Trailing, multiplier: 1, constant: 0))
    self.view.addConstraint(NSLayoutConstraint(item: captionTextView, attribute: .Bottom, relatedBy: .Equal, toItem: captionAndProfileImageContainerView, attribute: .Bottom, multiplier: 1, constant: 0))

    //likes and comments and divider


    self.view.addConstraint(NSLayoutConstraint(item: commentAndLikesContainerView, attribute: .Top, relatedBy: .Equal, toItem: containerView, attribute: .Top, multiplier: 1, constant: 0))
    self.view.addConstraint(NSLayoutConstraint(item: commentAndLikesContainerView, attribute: .Leading, relatedBy: .Equal, toItem: captionAndProfileImageContainerView, attribute: .Trailing, multiplier: 1, constant: 0))
    self.view.addConstraint(NSLayoutConstraint(item: commentAndLikesContainerView, attribute: .Trailing, relatedBy: .Equal, toItem: containerView, attribute: .Trailing, multiplier: 1, constant: 0))
    self.view.addConstraint(NSLayoutConstraint(item: commentAndLikesContainerView, attribute: .Bottom, relatedBy: .Equal, toItem: containerView, attribute: .Bottom, multiplier: 1, constant: 0))


    self.view.addConstraint(NSLayoutConstraint(item: voteUpButton, attribute: .Top, relatedBy: .Equal, toItem: commentAndLikesContainerView, attribute: .Top, multiplier: 1, constant: 0))
    self.view.addConstraint(NSLayoutConstraint(item: voteUpButton, attribute: .Leading, relatedBy: .Equal, toItem: commentButton, attribute: .Trailing, multiplier: 1, constant: 0))


    self.view.addConstraint(NSLayoutConstraint(item: likesLabel, attribute: .Top, relatedBy: .Equal, toItem: voteUpButton, attribute: .Bottom, multiplier: 1, constant: -5.5))
    self.view.addConstraint(NSLayoutConstraint(item: likesLabel, attribute: .Leading, relatedBy: .Equal, toItem: voteUpButton, attribute: .Leading, multiplier: 1, constant: 11.5))

    self.view.addConstraint(NSLayoutConstraint(item: voteDownButton, attribute: .Top, relatedBy: .Equal, toItem: likesLabel, attribute: .Bottom, multiplier: 1, constant: 0))
    self.view.addConstraint(NSLayoutConstraint(item: voteDownButton, attribute: .Leading, relatedBy: .Equal, toItem: likesLabel, attribute: .Leading, multiplier: 1, constant: -11.5))

    self.view.addConstraint(NSLayoutConstraint(item: commentButton, attribute: .Top, relatedBy: .Equal, toItem: commentAndLikesContainerView, attribute: .Top, multiplier: 1, constant: 37))
    self.view.addConstraint(NSLayoutConstraint(item: commentButton, attribute: .Leading, relatedBy: .Equal, toItem: commentAndLikesContainerView, attribute: .Leading, multiplier: 1, constant: 10))

    self.view.addConstraint(NSLayoutConstraint(item: commentLabel, attribute: .Top, relatedBy: .Equal, toItem: commentButton, attribute: .Top, multiplier: 1, constant: 7.5))
    self.view.addConstraint(NSLayoutConstraint(item: commentLabel, attribute: .Leading, relatedBy: .Equal, toItem: commentButton, attribute: .Leading, multiplier: 1, constant: 12.5))


现在,我尝试使用以下代码更改bottomContainerViewConstrainttopContainerViewConstraint并将containerView位置移动到屏幕顶部:

func moveViewFromBottomToTop(viewToBeMoved : UIView, bottomConstraint : NSLayoutConstraint, topConstraint : NSLayoutConstraint, completionHandler: (loaded: Bool, dataNil: Bool) -> ()) -> () {
    if (topConstraint.constant >  (-self.view.frame.height)) {
        topConstraint.constant = -self.view.frame.height
        bottomConstraint.constant = -self.view.frame.height + 120
        UIView.animateWithDuration(0.5, delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: {

            self.view.layoutIfNeeded()

            }, completion: { (completed) in


        })
    }

}


代码中提到的所有其他视图都是containerView的所有子视图。我收到以下错误:

 2016-06-16 23:35:33.282 City[18312:474417] 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:0x7f95e1577e30 UIView:0x7f95e1566670.bottom == UIView:0x7f95e161a710.bottom - 547>",
"<NSLayoutConstraint:0x7f95e159eb40 UIView:0x7f95e1566670.top == UIView:0x7f95e161a710.bottom - 120>",
"<NSLayoutConstraint:0x7f95e15c1160 UIView:0x7f95e15667e0.top == UIView:0x7f95e1566670.top>",
"<NSLayoutConstraint:0x7f95e1502ed0 UIView:0x7f95e15667e0.bottom == UIView:0x7f95e1566670.bottom>",
"<NSLayoutConstraint:0x7f95e15163b0 UITextView:0x7f95e2107c00.top == UIView:0x7f95e15667e0.top>",
"<NSLayoutConstraint:0x7f95e1552b50 UITextView:0x7f95e2107c00.bottom == UIView:0x7f95e15667e0.bottom>"
)

Will attempt to recover by breaking constraint
 <NSLayoutConstraint:0x7f95e159eb40 UIView:0x7f95e1566670.top == UIView:0x7f95e161a710.bottom - 120>


我不明白为什么这是一个问题。由于这些约束都是containerView的所有子视图,并且所有约束都相对于containerView,因此这些约束不应该自动调整吗?

最佳答案

不要忘记是否使用代码约束,您需要禁用translateAutoResizingMaskIntoConstraints

例如:

captionAndProfileImageContainerView.translateAutoresizingMaskIntoConstraints = false
captionTextView.translateAutoresizingMaskIntoConstraints = false


并对所有子视图进行操作

关于ios - 移动parentView时的约束错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37870574/

10-12 12:52
查看更多