我在这个 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】:让我们调试一下。如果您使用的是视觉格式约束,则想法是为每个视图设置一个 Horizontal
和 Vertical
约束。但我看到您对视图有多个限制。
另外,请记住将每个视图的translateAutoresizingMask
设置为false
。
让我们跟踪约束。
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[imageView]-[titleLabel]|", options: [], metrics: nil, views: views)
这里 ImageView
和 titleLabel
有 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 上简单滑动动画