Swift 如何根据UIImaveView的图像调整其大小?

Swift 如何根据UIImaveView的图像调整其大小?,swift,uiimageview,Swift,Uiimageview,我想让UIImageView尽可能多地填充容器,但容器内的图片应保持其纵横比,并且容器应适合其中图片的大小 下面是它现在无法工作时的情况: 我已经解决了这个问题,但只有在第一次加载视图时,当我更改imageView的图像时,它才会变得越来越小 我用这个扩展解决了这个问题: 因此,当获取UIImage时,我调用layout方法来布局我的UIViews,然后在UIImageView中设置图像。接下来,在父UIView的绘图方法中,我计算UIImageView的contentClippingRec

我想让
UIImageView
尽可能多地填充容器,但容器内的图片应保持其纵横比,并且容器应适合其中图片的大小

下面是它现在无法工作时的情况:

我已经解决了这个问题,但只有在第一次加载视图时,当我更改imageView的图像时,它才会变得越来越小

我用这个扩展解决了这个问题:

因此,当获取
UIImage
时,我调用layout方法来布局我的UIViews,然后在UIImageView中设置图像。接下来,在父UIView的绘图方法中,我计算
UIImageView
contentClippingRect
,然后将
UIImageView
的约束设置为
contentClippingRect
并再次布局

当imageView中没有图像时,我的布局方法将
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)
}

非常感谢你的帮助

您也可以从情节提要中创建适合自己的方面。转到该图像视图的属性检查器,您将从中找到内容模式。这里有一个例子

你也可以通过编程来完成

斯威夫特

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,

您还可以使方面与故事板相适应。转到该图像视图的属性检查器,您将从中找到内容模式。这里有一个例子

你也可以通过编程来完成

斯威夫特

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,

你能给出预期行为的例子吗?预期行为应该像在图像中,但是UIimageView的边框应该在图像上。你能给出预期行为的例子吗?预期行为应该像在图像中,但是UIimageView的边框应该在图像上是的,我知道,我使用这个,但是由于ImageView的边框,ImageView需要获取其图像的大小。是否设置其高度或宽度的约束?当调用setPictureName()并在layout中当image==nil时,uiview将获取我知道的容器的框架,我使用它,但ImageView需要获取其图像的大小,由于imageView的边框,您是否为其高度或宽度设置约束?当调用setPictureName()时,以及在布局中当image==nil时,uiview将获取容器的框架