我想在下面放置三个View 布局:
ImageView:II 文字标签:TT TitleLabel: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!)
它有效...几乎没问题。 我没有收到我想要的布局,但是我收到了一个可接受的布局,但有一些错误。
但是控制台也报告了一些让我担心的事情:
有人可以帮帮我吗? 我没有真正体验过NSLayoutConstraints,特别是在Swift中没有。以下列表中的至少一个约束可能是一个 你不想要。试试这个:(1)看看每个约束并尝试 找出你不期望的; (2)找到添加的代码 不需要的约束或约束并修复它。 ( "&#34 ;, "&#34 ;, "&#34 ;, "" )
如果你可以帮助我获得希望的布局或修复控制台想要修复的东西,那将是很棒的。
非常感谢!
答案 0 :(得分:1)
让我们调试一下。如果您使用视觉格式约束,那么想法是为每个视图设置一个Vertical
和translateAutoresizingMask
约束。但我发现你对视图有多种限制。
另外,请务必将每个视图的false
设置为 constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[imageView]-[titleLabel]|", options: [], metrics: nil, views: views)
。
让我们跟踪约束。
ImageView
此处titleLabel
和 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)
有1个地平线的约束。继续前进,我把总计数放在下面。
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)
答案很简单,你只需要一个约束。例如,
class foo(object):
def __init__(self):
self.num = 10
def getNum(self):
return self.num