Нет встроенного способа изменить размер 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
}
}
Примечания:
- При настройке этого на раскадровке перетащите
UIImageView
и измените его класс на ResizingImageView
в Identity Inspector .
- Установите ограничения для размещения imageView и установите его ширину (например: установите начальные и конечные ограничения для его суперпредставления).
- Задайте ему ограничение высоты, а затем измените приоритет этого ограничения на
Low (250)
в Size Inspector , чтобы ограничение apectRatio могло контролировать высоту imageView.
- Добавьте
@IBOutlet
к вашему изображению: @IBOutlet var imageView: ResizingImageView!
- Когда пришло время добавить изображение:
imageView.setImageAndUpdateAspectRatio(image: newImage)