Как удалить интервал из аспекта UIImageView в Swift

Я создал UIImageView и назначил ему UIImage. Я установил режим содержимого UIImageView на Aspect Fit. Как удалить прописку из верхней и нижней части изображения или как изменить размер UIImageView для обертки вокруг изображения? Я пробовал все.

Если вы собираетесь сказать, чтобы получить новый размер изображения, это не сработает. Получение размера изображения внутри UIImageView дает только ширину и высоту исходного изображения.

Пожалуйста, не связывайте другие сообщения. Я их уже прочитал. Они не работают.

введите описание изображения здесь

Ответ 1

Вы можете рассчитать его вручную для размеров кадров UIImageView, которые Aspect Fit с вашим изображением, или использовать AVMakeRectWithAspectRatioInsideRect (метод от AVFoundation).

Ответ 2

Итак, скажем, у вас установлен UIImageView равным ширине относительно представления. Одним из способов перерисовки изображения в соответствии с этим было бы использование Core Graphics. Что вы делаете, так это рассчитать масштабный коэффициент, необходимый для правильной покраски изображения. Здесь вы можете найти отличные образцы:

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

Ответ 3

Это слишком легко, когда вы используете 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()
    }