我无法在NSLayoutConstraints

时间:2017-05-07 18:43:45

标签: ios swift uiimageview nslayoutconstraint

我想在下面放置三个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!)

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

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

  

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

有人可以帮帮我吗? 我没有真正体验过NSLayoutConstraints,特别是在Swift中没有。

如果你可以帮助我获得希望的布局或修复控制台想要修复的东西,那将是很棒的。

非常感谢!

1 个答案:

答案 0 :(得分:1)

让我们调试一下。如果您使用视觉格式约束,那么想法是为每个视图设置一个VerticaltranslateAutoresizingMask约束。但我发现你对视图有多种限制。

另外,请务必将每个视图的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