UIImageView调整大小以消除空白IOS

UIImageView调整大小以消除空白IOS,ios,swift,uiimageview,Ios,Swift,Uiimageview,MyUIImageView处于aspect fit模式,在实际图像下方留下空白 蓝色空间是我想要消除的,因此imageView包装图像(如果我有包装内容的话)。这似乎是一项简单的任务,但我很快意识到,图像在方面上是合适的,因此图像视图会改变图像的宽度和高度,但随后我必须根据修改后的图像对图像视图进行计算,这将使图像不断缩小 我只想删除空白,让它看起来更简洁。GitHub的完整项目:我最近为此提交了一份雷达文件,因为我认为这是一种不正常的行为 目前,我发现解决此问题的最佳方法是基于图像的纵横比

My
UIImageView
处于aspect fit模式,在实际图像下方留下空白

蓝色空间是我想要消除的,因此imageView包装图像(如果我有包装内容的话)。这似乎是一项简单的任务,但我很快意识到,图像在方面上是合适的,因此图像视图会改变图像的宽度和高度,但随后我必须根据修改后的图像对图像视图进行计算,这将使图像不断缩小


我只想删除空白,让它看起来更简洁。GitHub的完整项目:

我最近为此提交了一份雷达文件,因为我认为这是一种不正常的行为

目前,我发现解决此问题的最佳方法是基于图像的纵横比向图像视图添加纵横比约束。(但当图像更改时,必须更新约束)

类似于

imageView.widthAnchor.constraint(equalTo: imageView.heightAnchor, multiplier: image.size.width / image.size.height).isActive = true
您可以将其包装到
UIImageView
子类中。覆盖
image
属性的
didSet
,甚至只添加一个新函数

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

因此,根据答案,而不是宽度,将视图的约束更改为高度,然后从高度到宽度

let newsize = self.feedImage.contentClippingRect

self.feedImage.heightAnchor.constraint(equalTo: self.feedImage.widthAnchor, multiplier:newsize.width / newsize.height).isActive = true
其中newsize是使用.scaleaspectfit进行缩放后的CGRect 请注意下面的扩展名


是否要更改宽度以获得一致的高度?或者更改高度以获得一致的宽度?很抱歉,我真的不明白这个问题。@DonMag我想我想更改高度以获得一致的宽度,但是我已经计算了每个单元格的宽度量,这将与UIImageView相同。我想我只是想知道您计划如何并排布局元素,其中一个图像可能高而窄(如T恤),下一个图像可能短而宽(如鞋)。如果您试图调整图像的大小以删除额外的空白,您可能会对其中一个感到满意,但对另一个则不满意。(虽然有点偏离了实际尺寸到外观的问题)谢谢它确实有帮助!
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)
    }
}