UIImageView调整大小以消除空白空间IOS

问题描述 投票:2回答:2

我的UIImageView处于纵横拟合模式,在实际图像下方留下空白。

UIImageView displayment

蓝色空间是我想要消除的,所以imageView包装图像(如果我只有包装内容)。看起来像一个简单的任务,但我很快就意识到图像是方位适合所以图像视图改变了图像的宽度和高度但是我必须根据改变的图像对图像视图进行计算永远不会结束缩小图像的循环。

UIImageView in the app

我只想删除空白区域,使其看起来更简洁。 GitHub上的完整项目:https://github.com/sak6lab/Closet-Space

ios swift uiimageview
2个回答
5
投票

我最近为此提出了一个雷达,因为我认为它是破碎的行为。

目前,我发现解决此问题的最佳方法是根据图像的纵横比向图像视图添加纵横比约束。 (虽然图像会发生变化,但您必须更新约束)。

就像是...

imageView.widthAnchor.constraint(equalTo: imageView.heightAnchor, multiplier: image.size.width / image.size.height).isActive = true

你可以将它包装成一个UIImageView子类。覆盖didSet属性的image甚至只需添加一个新函数。

但要小心,因为您需要确保只创建一个约束,并在后续传递中更新已存在的约束。


0
投票

因此,基于Fogmeister答案,而不是宽度,将其更改为高度,然后将视图的高度更改为宽度

let newsize = self.feedImage.contentClippingRect

self.feedImage.heightAnchor.constraint(equalTo: self.feedImage.widthAnchor, multiplier:newsize.width / newsize.height).isActive = true

在我们使用.scaleaspectfit进行扩展后,newsize是CGRect注意以下来自https://www.hackingwithswift.com/example-code/uikit/how-to-find-an-aspect-fit-images-size-inside-an-image-view的扩展

extension UIImageView {
    var contentClippingRect: CGRect {
    guard let image = image else { return bounds }
    guard contentMode == .scaleAspectFit else { return bounds }
    guard image.size.width > 0 && image.size.height > 0 else { return bounds }

    let scale: CGFloat
    if image.size.width > image.size.height {
        scale = bounds.width / image.size.width
    } else {
        scale = bounds.height / image.size.height
    }

    let size = CGSize(width: image.size.width * scale, height: image.size.height * scale)
    let x = (bounds.width - size.width) / 2.0
    let y = (bounds.height - size.height) / 2.0
    //print ("image resizing[width=\(size.width), height=\(size.height)")
    return CGRect(x: x, y: y, width: size.width, height: size.height)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.