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

问题描述 投票:0回答:1

我希望有一个UIImageView尽可能多地填充容器,但它内部的图片应保持其纵横比,容器应该适合其中的图片大小。

这是一张当它不起作用时的情况:

https://imgur.com/a/S9WSHmc

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

我用这个扩展解决了它:

https://www.hackingwithswift.com/example-code/uikit/how-to-find-an-aspect-fit-images-size-inside-an-image-view

所以当得到一个UIImage时,我调用布局方法来布局我的UIViews,然后在UIImageView中设置图像。接下来,在父UIView的绘制方法中,我计算contentClippingRectUIImageView,然后再次将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)
}

非常感谢您的帮助!

swift uiimageview
1个回答
1
投票

你也可以通过故事板制作方面。转到该imageView的属性检查器,您将从那里找到内容模式。这是一个例子enter image description here

你也可以以编程方式做到这一点。

为了迅速

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,
© www.soinside.com 2019 - 2024. All rights reserved.