Как изменить размер UIImaveView на основе его изображения? - PullRequest
0 голосов
/ 26 марта 2019

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

Воткартина того, как это сейчас, когда это не будет работать:

https://imgur.com/a/S9WSHmc

Я решил проблему, но только при первой загрузке вида, когда я меняю изображениеimageView становится все меньше и меньше.

Я решил это с помощью этого расширения:

https://www.hackingwithswift.com/example-code/uikit/how-to-find-an-aspect-fit-images-size-inside-an-image-view

Так что, получая UIImage, я вызываю метод макета для макетамои UIViews, затем я настроил изображение внутри UIImageView.Затем в методе рисования родительского UIView я вычисляю contentClippingRect для UIImageView, а затем устанавливаю ограничения UIImageView в contentClippingRect и снова размечаю.

Сбрасывает метод My Layoutограничения UIImageView на ограничения всего контейнера, когда в imageView нет изображения.

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

Вот что я попробовал:

var image: UIImage? {
    didSet {
        photoView.image = nil
        layout()
        photoView.image = image
    }
}

override func draw(_ rect: CGRect) {
    if photoView.image != nil {
        setPictureFrame()
        layout()
    }
}

private func setPictureFrame() {
    let photoRect = photoView.contentClippingRect
    photoView.clearConstraints()

    photoView.heightAnchor.constraint(equalToConstant: photoRect.height).isActive = true
    photoView.widthAnchor.constraint(equalToConstant: photoRect.width).isActive = true
}

private func layout() {

    var layoutConstraints: [NSLayoutConstraint] = []

    if photoView.image == nil {
        photoView.clearConstraints()
        photoView.constraintsFillWhole(view: photoViewContainer)
    }

    layoutConstraints += [
        photoView.centerXAnchor.constraint(equalTo: self.centerXAnchor),
        photoView.centerYAnchor.constraint(equalTo: photoViewContainer.centerYAnchor),
    ]
    NSLayoutConstraint.activate(layoutConstraints)
}

Большое спасибо за вашу помощь!

1 Ответ

1 голос
/ 26 марта 2019

Вы можете сделать аспект подходящим для раскадровки. Перейти к инспектору атрибутов этого imageView вы найдете режим контента оттуда. вот пример enter image description here

Вы можете сделать это и программно.

для быстрой

yourImageView.contentMode = .scaleAspectFill // or you can use .scaleToFill

для цели c

yourimageView.contentMode = UIViewContentModeScaleAspectFit;

Ниже приведены некоторые режимы содержания, которые вы можете использовать программно.

UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit,     
UIViewContentModeScaleAspectFill,   
UIViewContentModeRedraw,             
UIViewContentModeCenter,              
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...