UIImageView上的宽度和高度NSLayoutConstraints不起作用

Jua*_*lez 1 layout constraints interface-builder ios swift

我在View Controller的UIImgeView实例上设置.Width和.Top NSLayoutConstraints updateViewConstraints()。在XCode可视调试器中,我可以看到约束实际上已设置,但是由于某些原因,约束没有被使用(?),它们显示为un(内容大小),并且显示为灰色。当我使用NSLog输出约束时,我也可以看到它们已设置,但是以某种方式图像保持原始大小...这是什么意思?

constraints in parent: [<NSLayoutConstraint:0x7b379590 UIImageView:0x7af897b0.centerX == UIView:0x7b37d2e0.centerX>, 
                        <NSLayoutConstraint:0x7b36e3d0 V:|-(0)-[UIImageView:0x7af897b0]   (Names: '|':UIView:0x7b37d2e0 )>]
constraints in view: [<NSContentSizeLayoutConstraint:0x7ae892b0 H:[UIImageView:0x7af897b0(301)] Hug:251 CompressionResistance:750>, 
                      <NSContentSizeLayoutConstraint:0x7ae834e0 V:[UIImageView:0x7af897b0(365)] Hug:251 CompressionResistance:750>]
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

设置约束的代码:

/// Image view with the character + ellipse
@IBOutlet weak var charImageView: UIImageView!

override func updateViewConstraints() {
      super.updateViewConstraints()
      charImageView.widthLayoutConstraint?.constant = 301.0
      charImageView.heightLayoutConstraint?.constant = 365.0
}
Run Code Online (Sandbox Code Playgroud)

我用来获取扩展名widthLayoutConstraintheightLayoutConstraint

extension UIView{
  /**
   Gets the width layout constraint defined as the NSLayoutConstraint whose first item is self and first attribute is Height
   */
  var heightLayoutConstraint:NSLayoutConstraint? {
      get{
          for constraint in constraints {
              if  constraint.firstItem as? UIView == self &&
                  constraint.firstAttribute == NSLayoutAttribute.Height
              {
                  return constraint
              }
          }
          return nil
      }
  }

  /**
   Gets the width layout constraint defined as the NSLayoutConstraint whose first item is self and first attribute is Width
   */
  var widthLayoutConstraint:NSLayoutConstraint? {
      get{
          for constraint in constraints {
              if  constraint.firstItem as? UIView == self &&
                  constraint.firstAttribute == NSLayoutAttribute.Width
              {
                  return constraint
              }
          }
          return nil
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

这就是最初使用IB添加布局约束的方式。如您所见,它们是为紧凑宽度尺寸类添加的,当我看到问题时,我正在使用它们(iPhone4S模拟器)。

约束已经通过IB添加,我正在用代码更新它们的常量。调试器清楚地表明常数是“实际更新的”,但是以某种方式以原始大小绘制了图像。

在此处输入图片说明 在此处输入图片说明

Kam*_*pai 5

灰色约束表明这些约束存在但未安装在视图中。

请参考下图:

在此处输入图片说明

  1. 选择灰色约束
  2. 打开属性检查器
  3. 在底部,您可以看到Installed选项
  4. 如果未选中,则通过单击选中标记来启用它
  5. 这将在您的视图中安装选定的约束

更新:

您可以width使用以下代码添加约束:

self.addConstraint(NSLayoutConstraint(
        item: charImageView,
        attribute: .Width,
        relatedBy: .Equal,
        toItem: nil,
        attribute: .NotAnAttribute,
        multiplier: 1.0,
        constant: 301.0))
Run Code Online (Sandbox Code Playgroud)

您可以使用其他答案更新约束值:

以编程方式更新约束的常数值