如何在Swift中从UIImageView的等比缩放模式中移除间距

14
我创建了一个 `UIImageView` 并给它分配了一张 `UIImage`。我将 UIImageView 的内容模式设置为 `Aspect Fit`。如何去掉图像顶部和底部的填充,或如何调整 `UIImageView` 大小以适应图像?我尝试了所有方法。
如果你想要获取新的图像大小,这种方法行不通。在 `UIImageView` 内部获取图像大小只会给出原始图像的宽度和高度。
请不要链接到其他帖子。我已经阅读过它们,但它们没有解决我的问题。 enter image description here
3个回答

3
你可以手动计算UIImageView的大小,并使其适应你的图像,或使用AVFoundation中的AVMakeRectWithAspectRatioInsideRect方法。

虽然答案可以更详细,但它给了我一些解决问题的提示,谢谢! - thibaut noah
@thibautnoah,你修好了吗?请帮帮我。 - user1629977
@user1629977,我认为下面的回答已经足够了,伙计。 - thibaut noah

0

假设您有一个UIImageView与视图相等的宽度。重新绘制图像以适应的一种方法是使用核心图形。您需要计算所需的比例因子才能正确地重新绘制图像。您可以在此处找到一些很棒的示例:

https://github.com/natecook1000/Image-Resizing/blob/master/Image%20Resizing/ImageResizingMethods.swift

还有一个好的教程和基准测试,以更好地理解事物:

http://nshipster.com/image-resizing/

我使用的代码示例(基本上是修改了 GitHub 方法以适应我的需求):

            let image = UIImage(data: data!)
            let oldWidth = image!.size.width
            let scaleFactor = UIWindow().screen.bounds.width / oldWidth
            let cgImage = image!.CGImage

            let width = Double(CGImageGetWidth(cgImage)) * Double(scaleFactor)
            let height = Double(CGImageGetHeight(cgImage)) * Double(scaleFactor)
            let bitsPerComponent = CGImageGetBitsPerComponent(cgImage)
            let bytesPerRow = CGImageGetBytesPerRow(cgImage)
            let colorSpace = CGImageGetColorSpace(cgImage)
            let bitmapInfo = CGImageGetBitmapInfo(cgImage)

            let context = CGBitmapContextCreate(nil, Int(width), Int(height), bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo.rawValue)

            CGContextSetInterpolationQuality(context, .High)

            CGContextDrawImage(context, CGRect(origin: CGPointZero, size: CGSize(width: CGFloat(width), height: CGFloat(height))), cgImage)

            let scaledImage = CGBitmapContextCreateImage(context).flatMap { return UIImage(CGImage: $0) }
            imageView.image = scaledImage

0

当你使用NSLayoutConstraint时,它变得太容易了。

    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFit
    view.addSubview(imageView)
    imageView.translatesAutoresizingMaskIntoConstraints = false

    imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    imageView.widthAnchor.constraint(equalToConstant: 250).isActive = true
    let heightLayout = imageView.heightAnchor.constraint(equalToConstant: 250)
    heightLayout.isActive = true


    imageView.image = UIImage(named: "SomeImage")
    if let size = imageView.image?.size {
        heightLayout.constant = size.height / size.width * 250 // 250 is imageView width
        view.layoutIfNeeded()
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接