【问题标题】:My constraint breaking log doesn't make any sense, can someone help me understand?我的约束破坏日志没有任何意义,有人可以帮助我理解吗?
【发布时间】:2017-01-10 14:24:52
【问题描述】:

所以在我的 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)>

【问题讨论】:

  • 你能包含约束的字符串以及它破坏了什么约束吗?
  • 尝试移除底部约束。它仍然给你警告吗?
  • @yannick 移除底部约束使我的表格视图单元格缩小并且图像视图不可见

标签: swift autolayout constraints


【解决方案1】:

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

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

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

  1. 如果您要设置到 imageView 的图像已经具有您想要的纵横比:完全移除纵横比约束。请改用 imageView 的 contentMode 属性。

  2. 1234563调整大小。例如:也许您不需要前导和尾随约束,而您只是希望 imageView 与其父视图的左侧和右侧具有相同的距离?然后删除尾随和前导约束并添加一个“水平居中”约束。

【讨论】:

  • 水平添加一个中心并移除尾迹和前导约束使我的图像视图绑定扩展为大于包含它的单元格,使其在左侧和右侧被裁剪。您还有其他解决方案吗?
  • 如第 1 点:完全删除方面约束。将imageView的contentMode设置为UIViewContentModeScaleAspectFit
  • 我一开始加方面约束的原因就是这个问题:stackoverflow.com/questions/26041820/….
  • 你设置tableView.rowHeight = UITableViewAutomaticDimension了吗?
  • 也许尝试将顶部和底部空间限制设置为 999 而不是默认的 1000?
猜你喜欢
  • 2021-09-04
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2021-02-21
  • 1970-01-01
相关资源
最近更新 更多