Я разрабатываю приложение, которое отображает в основном ViewController изображение профиля пользователя внутри круга UIBarButtonItem, поэтому я использую настраиваемую кнопку с включенными cornerRadius и clipsToBounds, я я изменяю ширину UIImage до 75% от высоты NavigationBar, чтобы она хорошо вписывалась в него, я также использовал button.imageView?.contentMode = .scaleAspectFill

Когда я использую квадратное изображение (ширина = высота), оно работает идеально, но если я использую портретное или горизонтальное изображение, это выглядит так, как если бы BarButton использовал .scaleAspectFit

Я уже пытался сначала создать квадратное UIImage обрезанное исходное изображение профиля, но безуспешно.

Это мой код кнопки Bar:

func setProfileButton() {
    let width = self.navigationController!.navigationBar.frame.size.height * 0.75

    if let image = ResizeImage(CFUser.current!.getProfileImage(), to: width) {
        let button = UIButton(type: .custom)
        button.setImage(image, for: .normal)
        button.imageView?.contentMode = .scaleAspectFill
        button.addTarget(self, action: #selector(goProfile), for: .touchUpInside)
        button.frame = CGRect(x: 0, y: 0, width: width, height: width)
        button.layer.cornerRadius = button.bounds.width / 2
        button.clipsToBounds = true

        let barButton = UIBarButtonItem(customView: button)

        self.navigationItem.rightBarButtonItem = barButton
    }
}

Это код ResizeImage:

func ResizeImage(_ image: UIImage, to width: CGFloat) -> UIImage? {
    let size = image.size
    let ratio = width / image.size.width
    let height = image.size.height * ratio
    let targetSize = CGSize(width: width, height: height)

    let widthRatio  = targetSize.width  / image.size.width
    let heightRatio = targetSize.height / image.size.height

    var newSize: CGSize
    if(widthRatio > heightRatio) {
        newSize = CGSize(width: size.width * heightRatio,height: size.height * heightRatio)
    } else {
        newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio)
    }

    let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

    UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
    image.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

Вот приложение, работающее с квадратным изображением

Here is the app working with squared image

И это с портретным изображением

And this is with a portrait image

Спасибо за вашу помощь! :)

PD: Я использую Xcode 10 и Swift 4

1
Luis 2 Ноя 2018 в 18:52

1 ответ

Лучший ответ

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

Замените метод ResizeImage(_ image: UIImage, to width: CGFloat) -> UIImage? приведенным ниже.

func ResizeImage(_ image: UIImage, to width: CGFloat) -> UIImage? {

    let ratio = width / image.size.width
    let height = image.size.height * ratio
    let dimension = min(width, height)
    let targetSize = CGSize(width: dimension, height: dimension)

    let rect = CGRect(x: 0, y: 0, width: targetSize.width, height: targetSize.height)

    UIGraphicsBeginImageContextWithOptions(targetSize, false, 1.0)
    image.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

Квадратное изображение:

enter image description here

Портретное изображение:

enter image description here

0
Sateesh Yemireddi 3 Ноя 2018 в 10:18