Как изменить размер UIImageView на основе размера/отношения UIImage в Swift 3?

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

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

В настоящее время я использую Aspect fit, но UIImageView остается пустым на больших участках. Я бы хотел, чтобы UIImageView размер на основе его содержимого. Например, если pic 1:1, 4: 3, 6: 2, 16: 9...

enter image description here

Помощь очень ценится.

По просьбе, это то, что я хочу:

enter image description here

У меня был UIImageView который был квадратным, загруженный с изображением в UIImageView 16: 7 или любым UIImageView а UIImageView в соответствии с размером изображения...

Ответ 1

Похоже, вы хотите изменить размер ImageView в соответствии с соотношением изображений и размером контейнера, вот пример в Swift (извините, бывший ответ с ошибкой, я исправил его):

   let containerView = UIView(frame: CGRect(x:0,y:0,width:320,height:500))
   let imageView = UIImageView()

    if let image = UIImage(named: "a_image") {
        let ratio = image.size.width / image.size.height
        if containerView.frame.width > containerView.frame.height {
            let newHeight = containerView.frame.width / ratio
            imageView.frame.size = CGSize(width: containerView.frame.width, height: newHeight)
        }
        else{
            let newWidth = containerView.frame.height * ratio
            imageView.frame.size = CGSize(width: newWidth, height: containerView.frame.height)
        }
    }

Ответ 2

Я потратил много часов, пытаясь найти решение той же проблемы, с которой вы столкнулись, и это единственное решение, которое сработало для меня (Swift 4, xCode 9.2):

class ScaledHeightImageView: UIImageView {

    override var intrinsicContentSize: CGSize {

        if let myImage = self.image {
            let myImageWidth = myImage.size.width
            let myImageHeight = myImage.size.height
            let myViewWidth = self.frame.size.width

            let ratio = myViewWidth/myImageWidth
            let scaledHeight = myImageHeight * ratio

            return CGSize(width: myViewWidth, height: scaledHeight)
        }

        return CGSize(width: -1.0, height: -1.0)
    }

}

Добавьте класс в проект и установите UIImageView в пользовательский класс ScaledHeightImageView. Режим просмотра изображений - Aspect Fit.

Моя проблема такая же, как и в этой статье. Внутри моего прототипа TableViewCell ContentView у меня есть вертикальный StackView, ограниченный каждым ребром. Внутри StackView была метка, ImageView и еще одна метка. Недостаточно установить ImageView в AspectFit. Изображение будет правильным размером и пропорциями, но ImageView не обертывает фактическое изображение, оставляя кучу лишнего пространства между изображением и меткой (как и на изображении выше). Высота ImageView, по-видимому, соответствовала высоте исходного изображения, а не высоте размера изображения (после того, как aspectFit выполнил задание). Другие решения, которые я нашел, не полностью разрешали проблему по разным причинам. Я надеюсь, что это помогает кому-то.

Ответ 3

Я потратил много часов на это, и я наконец получил решение, которое сработало для меня (Swift 3):

  • в IB, я установил режим содержимого UIImageView 'Aspect Fit'
  • в IB, я устанавливаю ограничение ширины UIImageView равным тому, что вы хотите (в моем случае, ширина представления)
  • в IB, я устанавливаю ограничение высоты UIImageView равным 0 и создаю для него реферирующий выход (скажем, constraintHeight)

Затем, когда мне нужно отобразить изображение, я просто пишу следующее (взятое из ответов выше):

let ratio = image.size.width / image.size.height
let newHeight = myImageView.frame.width / ratio
constraintHeight.constant = newHeight
view.layoutIfNeeded()

В принципе, это гарантирует, что изображение заполняет ширину UIImageView и заставляет высоту UIImageView быть равной высоте изображения после масштабирования

Ответ 4

Задайте свой ImageView в aspectFit, который изменит размер изображения, чтобы он не превышал рамку изображения.

Вы можете получить размер вашего UIImage вашего imageView с логикой из этого вопроса - в основном просто получите высоту и ширину UIImage.

Вычислите соотношение и установите ширину/высоту изображения в соответствии с вашим экраном.

У вас также есть аналогичный вопрос, на который вы можете получить ответ.