Swift программно создает uiimageview полную ширину экрана, сохраняя соотношение высоты - PullRequest
1 голос
/ 15 июня 2019

Я использую следующий код для программного создания uiimageview.

var imageView : UIImageView
imageView  = UIImageView(frame:CGRectMake(10, 50, 100, 300));
imageView.image = UIImage(named:"image.jpg")
self.view.addSubview(imageView)

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

Как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Нет встроенного способа изменить размер UIImageView на основе image. Вы должны отрегулировать высоту imageView, изменив высоту кадра или установив новое ограничение соотношения сторон при обновлении изображения.

Существует параметр contentMode (.scaleAspectFit) для UIImageView, который может поддерживать соотношение сторон изображения в пределах imageView, но он не изменяет размер самого imageView, а просто помещает изображение в него, добавляя отступы над и под изображением или в стороны, необходимые для сохранения соотношения сторон.

Обновление фрейма:

Вот расширение для UIImageView, которое изменяет высоту frame, когда установлен image:

extension UIImageView {
    func setImageAndUpdateFrameHeight(image: UIImage) {
        self.image = image

        if image.size.width > 0 {
            self.frame.size.height = self.frame.size.width / image.size.width * image.size.height
        }
    }
}

Обновление соотношения сторон при использовании Авторазметка

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

class ResizingImageView: UIImageView {
    var aspectRatio: NSLayoutConstraint?

    func setImageAndUpdateAspectRatio(image: UIImage) {
        self.image = image

        aspectRatio?.isActive = false
        if image.size.width > 0 {
            aspectRatio = self.heightAnchor.constraint(equalTo: self.widthAnchor, multiplier: image.size.height / image.size.width)
        }
        aspectRatio?.isActive = true
    }
}

Примечания:

  1. При настройке этого на раскадровке перетащите UIImageView и измените его класс на ResizingImageView в Identity Inspector .
  2. Установите ограничения для размещения imageView и установите его ширину (например: установите начальные и конечные ограничения для его суперпредставления).
  3. Задайте ему ограничение высоты, а затем измените приоритет этого ограничения на Low (250) в Size Inspector , чтобы ограничение apectRatio могло контролировать высоту imageView.
  4. Добавьте @IBOutlet к вашему изображению: @IBOutlet var imageView: ResizingImageView!
  5. Когда пришло время добавить изображение: imageView.setImageAndUpdateAspectRatio(image: newImage)
0 голосов
/ 15 июня 2019

Вы должны установить для contentMode значение .scaleAspectFit.

let imageView = UIImageView(frame: self.view.frame) 
imageView.image = UIImage(named:"image.jpg") 
imageView.contentMode = .scaleAspectFit 
self.view.addSubview(imageView)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...