我的约束破坏日志没有任何意义,有人可以帮助我理解吗?

时间:2017-01-10 14:24:53

标签: swift autolayout constraints

所以在我的tableViewCell中,我有一个imageView,它对尾随和超前视图有0点约束。超视图的最高约束为8,最低限制为30。然后我根据图像使用以下代码添加imageView的方面约束:

override var image: UIImage? {
        didSet {
            if let image = image {
                let aspect = image.size.width / image.size.height
                aspectConstraint = NSLayoutConstraint(item: self,
                                                      attribute: NSLayoutAttribute.width,
                                                      relatedBy: NSLayoutRelation.equal,
                                                      toItem: self,
                                                      attribute: NSLayoutAttribute.height,
                                                      multiplier: aspect,
                                                      constant: 0.0)
            }
        }
    }

    internal var aspectConstraint : NSLayoutConstraint? {
        didSet {
            if oldValue != nil {
                self.removeConstraint(oldValue!)
            }
            if aspectConstraint != nil {
                self.addConstraint(aspectConstraint!)
            }
        }
    }

我的代码如何破坏任何约束?他们与彼此没有任何关系

  

2017-01-10 21:15:18.502301 Gymkhana [4538:65958] [LayoutConstraints]   无法同时满足约束。可能至少有一个   以下列表中的约束是您不想要的。尝试   这个:(1)看看每个约束并试着弄清楚你是哪个   不要指望; (2)找到添加了不需要的约束的代码   或约束并修复它。 (

"<NSLayoutConstraint:0x78698d60 UILabel:0x7869e890'Identical twins play a mi...'.top == UITableViewCellContentView:0x7869e500.topMargin   (active)>",
"<NSLayoutConstraint:0x7869c930 V:[UILabel:0x79ba65a0'1h']-(8)-[Gymkhana.ThumbnailImageView:0x7869c340] (active)>",
"<NSLayoutConstraint:0x786a9ef0 H:[Gymkhana.ThumbnailImageView:0x7869c340]-(0)-|   (active, names: '|':UITableViewCellContentView:0x7869e500 )>",
"<NSLayoutConstraint:0x78689700 H:|-(0)-[Gymkhana.ThumbnailImageView:0x7869c340]   (active, names: '|':UITableViewCellContentView:0x7869e500 )>",
"<NSLayoutConstraint:0x7869a1b0 V:[Gymkhana.ThumbnailImageView:0x7869c340]-(30)-|   (active, names: '|':UITableViewCellContentView:0x7869e500 )>",
"<NSLayoutConstraint:0x7869ca10 V:[UILabel:0x7869e890'Identical twins play a mi...']-(8)-[UILabel:0x79ba65a0'1h']   (active)>",
"<NSLayoutConstraint:0x798fb620 Gymkhana.ThumbnailImageView:0x7869c340.width == Gymkhana.ThumbnailImageView:0x7869c340.height   (active)>",
"<NSLayoutConstraint:0x79b85b80 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7869e500.height == 329   (active)>",
"<NSLayoutConstraint:0x79b82b80 'UIView-Encapsulated-Layout-Width' UITableViewCellContentView:0x7869e500.width == 320   (active)>" )

将尝试通过违反约束来恢复

<NSLayoutConstraint:0x798fb620
Gymkhana.ThumbnailImageView:0x7869c340.width==Gymkhana.ThumbnailImageView:0x7869c340.height   (active)>

1 个答案:

答案 0 :(得分:2)

约束可以被处理为AutoLayout在尝试计算视图的4个参数时使用的规则:x,y(表示左上角的坐标),宽度和高度。你在图像视图上加了5个约束,所以除了特殊情况之外,它们之间会有一些冲突。

您提到的前4个约束已经为AutoLayout提供了足够的信息来计算我提到的imageView的所有4个参数。然后进入宽高比约束,几乎肯定会与其他约束冲突,除非您之前已经导致与您在约束中设置的完全相同的方面。

有两种方法可以解决这个问题:

  1. 如果要设置为imageView的图像已具有所需的宽高比:完全删除宽高比约束。请改用imageView&#39; contentMode属性。

  2. 如果你确实需要一个特定的宽高比到你的imageView,那么你需要重新考虑你的其他4个约束,因为它们中的一些似乎没有准确地表示你想要如何定位你的imageView和调整大小。例如:您可能不需要前导和尾随约束,并且您只是希望imageView与其超视图的左侧和右侧具有相同的距离?然后删除尾随和前导约束并水平添加&#34;中心#34;相反,约束。