NSLayoutConstraint问题

NSLayoutConstraint problen

//MARK: NSLayoutConstraints
//trailing
let trailingConstaint = NSLayoutConstraint(item: imageView, attribute: .trailing, relatedBy: .equal, toItem:imageView.superview , attribute: .trailing, multiplier: 1, constant: 0)
trailingConstaint.isActive = true

//leading
let leadingConstraint = NSLayoutConstraint(item: imageView, attribute: .leading, relatedBy: .equal, toItem: imageView.superview, attribute: .leading, multiplier: 1, constant: 0)
leadingConstraint.isActive = true

//top
let topConstraint = NSLayoutConstraint(item: image, attribute: .top, relatedBy: .equal, toItem: imageView.superview, attribute: .top, multiplier: 1, constant: 0)
topConstraint.isActive = true

//bottom
let bottomConstraint = NSLayoutConstraint(item: imageView, attribute: .bottom, relatedBy: .equal, toItem: imageView.superview, attribute: .bottom, multiplier: 1, constant: 0)
bottomConstraint.isActive = true

我想调整图像大小以适合图像,以便正确缩放图像 screenshot of ViewController

但是我得到这个错误..

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSLayoutConstraint for size {746, 496} orientation 0 scale 1.000000: Constraint items must each be an instance of UIView, or UILayoutGuide.'

在您的第三个约束中,您使用了 image 而不是 imageView。您不能对图像设置约束,只能对视图设置约束。看你是怎么设置的 imageView.

您为什么不简单地在 Interface Builder 中设置约束是有原因的吗?他们很直接。

您可以设置 UIImageViewcontentMode 属性 来确定图像的缩放方式。 scaleAspectFill 通常是您想要的,但如果图像不完全适合视图,这将导致图像被裁剪。 scaleAspectFit 将确保显示整个图像,但如果图像大小与视图大小不匹配,则需要进行一些填充。 scaleToFill 将在不填充的情况下填充视图,可能会以扭曲图像为代价。

//top
let topConstraint = NSLayoutConstraint(item: image, attribute: .top, relatedBy: .equal, toItem: imageView.superview, attribute: .top, multiplier: 1, constant: 0)
topConstraint.isActive = true

您正在将此约束设置为 image 而不是 imageView

异常明确指出Constraint items must each be an instance of UIView, or UILayoutGuide.'

所有其他约束都设置在imageViewimageView.superView之间,所以按道理上面的约束也应该使用相同的对.

这将处理异常。

//top
let topConstraint = NSLayoutConstraint(item: imageView, attribute: .top, relatedBy: .equal, toItem: imageView.superview, attribute: .top, multiplier: 1, constant: 0)
topConstraint.isActive = true

但是,图像缩放不能通过约束来实现。您必须适当地设置 contentMode 属性。查看 了解图像的缩放方式 well-explained docs.

部分

您似乎在 topConstraint 中引用了 image 而不是 imageView。 如果不多看你的代码就很难确定,但尝试更新它看看它是否有效。

let topConstraint = NSLayoutConstraint(item: imageView, attribute: .top, relatedBy: .equal, toItem: imageView.superview, attribute: .top, multiplier: 1, constant: 0)
topConstraint.isActive = true