我在这个 NSLayoutConstraints 看不到错误

Posted

技术标签:

【中文标题】我在这个 NSLayoutConstraints 看不到错误【英文标题】:I can't see the mistake at this NSLayoutConstraints 【发布时间】:2017-05-07 18:43:44 【问题描述】:

我想在下面放置三个视图 布局:

图像视图:II 文字标签:TT 标题标签:TL 空格:S

SSSSSS-TL-SSSSS IISSSSTT-------------- SSSSSSSSSSSSSS

我目前的代码如下:

let views = ["imageView": imageView, "titleLabel": titleLabel, "messageLabel": messageLabel] as [String : Any]
        var constraints = [NSLayoutConstraint]()

        constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[imageView]-[titleLabel]|", options: [], metrics: nil, views: views)
        constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-(==20@900)-[titleLabel]-(==20@900)-|", options: [], metrics: nil, views: views)
        constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|[imageView]-[messageLabel]-(==20@900)-|", options: [], metrics: nil, views: views)
        constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|[imageView]-(==30@200)-[titleLabel]-(==8@200)-[messageLabel]-(==30@200)-|", options: [], metrics: nil, views: views)
        imageHeightConstraint = NSLayoutConstraint(item: imageView, attribute: .height, relatedBy: .equal, toItem: imageView, attribute: .height, multiplier: 0, constant: 0)
        constraints.append(imageHeightConstraint!)

它工作...几乎没问题。 我没有收到我想要的布局,但我收到了一个可接受的布局,但有一些错误。

但控制台也报告了一些让我担心的事情:

可能至少以下列表中的一个约束是一个 你不想要。试试这个:(1)查看每个约束并尝试 找出你没想到的; (2) 找到添加的代码 不需要的约束或约束并修复它。 ( "", "", "", "")

有人可以帮我吗? 一般来说,我对 NSLayoutConstraints 没有太多经验,尤其是在 Swift 中。

如果您能帮助我获得想要的布局或修复控制台想要修复的东西,那就太好了。

非常感谢!

【问题讨论】:

手动创建约束很痛苦。您是否尝试过使用 pod,例如 Cartography? 还没有。我可以使用它,但我会先看看其他答案。谢谢! 【参考方案1】:

让我们调试一下。如果您使用的是视觉格式约束,则想法是为每个视图设置一个 HorizontalVertical 约束。但我看到您对视图有多个限制。

另外,请记住将每个视图的translateAutoresizingMask 设置为false

让我们跟踪约束。

  constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[imageView]-[titleLabel]|", options: [], metrics: nil, views: views)

这里 ImageViewtitleLabel 有 1 个水平约束。继续前进,我把总数放在下面。

  constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-(==20@900)-[titleLabel]-(==20@900)-|", options: [], metrics: nil, views: views)
  constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|[imageView]-[messageLabel]-(==20@900)-|", options: [], metrics: nil, views: views)

  constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|[imageView]-(==30@200)-[titleLabel]-(==8@200)-[messageLabel]-(==30@200)-|", options: [], metrics: nil, views: views)

上述约束是冲突的。 为什么?因为您已经声明了Vertical 约束[ImageView - messageLabel],现在您正在制作[imageView - titleLabel - messageLabel]

  imageHeightConstraint = NSLayoutConstraint(item: imageView, attribute: .height, relatedBy: .equal, toItem: imageView, attribute: .height, multiplier: 0, constant: 0)

上述约束也没有用,因为您将imageView的高度约束设置为自身,它应该与它的superview或常量一起使用。

算上以上,您还有额外的限制。

  ImageView: H: 1  and V: 2  // You have extra height contraitns.
  titleLabel: H: 1 and V: 2
  messageLabel: H: 0 and V: 1

答案很简单,你只需要一个约束。例如

  // ImageView contrainst
  constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[imageView]-[titleLabel]|", options: [], metrics: nil, views: views)
  constraints(withVisualFormat: "V:|[imageView]-(==30@200)-[titleLabel]-(==8@200)-[messageLabel]-(==30@200)-|", options: [], metrics: nil, views: views)

【讨论】:

【参考方案2】:

您是否尝试过添加yourView.translatesAutoresizingMaskIntoConstraints = false 行? 我在以编程方式设置约束时遇到了这个问题,并且添加了这一行,并没有给我你所面临的问题。

【讨论】:

以上是关于我在这个 NSLayoutConstraints 看不到错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 NSLayoutConstraints 的 UIView 灵活高度

NSLayoutConstraints 在 ios 7 上崩溃,但在 ios 8 上没有

NSLayoutConstraints 的 UIViewPropertyAnimator 使视图消失

使用 NSLayoutConstraints 在 UIView 上简单滑动动画

在 UITableView 的标题视图上使用 NSLayoutConstraints

使用 NSLayoutConstraints 在 UITextView 中将 UILabel 居中