我希望有一个UIImageView
尽可能多地填充容器,但它内部的图片应保持其纵横比,容器应该适合其中的图片大小。
这是一张当它不起作用时的情况:
我已经解决了这个问题,但只有在第一次加载视图时,当我更改imageView的图像时,它变得越来越小。
我用这个扩展解决了它:
所以当得到一个UIImage
时,我调用布局方法来布局我的UIViews,然后在UIImageView中设置图像。接下来,在父UIView的绘制方法中,我计算contentClippingRect
的UIImageView
,然后再次将UIImageView
的约束设置为contentClippingRect
和布局。
当在imageView内部没有图像时,我的Layout方法将UIImageView
的约束重置为整个容器的约束。
但正如所说,当我改变图片时,它将无法工作,我在更改图像时遇到了约束问题。
这是我尝试过的:
var image: UIImage? {
didSet {
photoView.image = nil
layout()
photoView.image = image
}
}
override func draw(_ rect: CGRect) {
if photoView.image != nil {
setPictureFrame()
layout()
}
}
private func setPictureFrame() {
let photoRect = photoView.contentClippingRect
photoView.clearConstraints()
photoView.heightAnchor.constraint(equalToConstant: photoRect.height).isActive = true
photoView.widthAnchor.constraint(equalToConstant: photoRect.width).isActive = true
}
private func layout() {
var layoutConstraints: [NSLayoutConstraint] = []
if photoView.image == nil {
photoView.clearConstraints()
photoView.constraintsFillWhole(view: photoViewContainer)
}
layoutConstraints += [
photoView.centerXAnchor.constraint(equalTo: self.centerXAnchor),
photoView.centerYAnchor.constraint(equalTo: photoViewContainer.centerYAnchor),
]
NSLayoutConstraint.activate(layoutConstraints)
}
非常感谢您的帮助!
你也可以通过故事板制作方面。转到该imageView的属性检查器,您将从那里找到内容模式。这是一个例子
你也可以以编程方式做到这一点。
为了迅速
yourImageView.contentMode = .scaleAspectFill // or you can use .scaleToFill
为客观的c
yourimageView.contentMode = UIViewContentModeScaleAspectFit;
以下是您可以以编程方式使用的一些内容模式。
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit,
UIViewContentModeScaleAspectFill,
UIViewContentModeRedraw,
UIViewContentModeCenter,
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,