NSLayoutConstraint有问题

时间:2018-01-26 06:31:49

标签: ios swift autolayout nslayoutconstraint

//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

但是我得到了这个错误..

  

由于未捕获的异常而终止应用   'NSInvalidArgumentException',原因:'NSLayoutConstraint for    大小{746,496}方向0比例   1.000000:约束项必须都是UIView或UILayoutGuide的实例。'

3 个答案:

答案 0 :(得分:3)

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

您要将此约束设置为图像,而不是 imageView

该例外明确指出Constraint items must each be an instance of UIView, or UILayoutGuide.'

所有其他约束都在 imageView imageView.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.

中的了解图像缩放方式部分

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

在您的第三个约束中,您使用了image而不是imageView。您无法仅对视图设置图像约束。看看你如何设置imageView

您是否有理由不在Interface Builder中设置约束?他们非常直截了当。

您可以设置contentMode的{​​{1}}属性,以确定图像的缩放方式。 UIImageView通常是您想要的,但如果图像没有精确地适合视图,则会导致图像的一些裁剪。 scaleAspectFill将确保显示整个图像,但如果图像大小与视图大小不匹配,则需要一些填充。 scaleAspectFit将填充视图而不填充,可能会以扭曲图像为代价。