Как изменить размер UIImaveView на основе его изображения?

#swift #uiimageview

#swift #uiimageview

Вопрос:

Я хочу, чтобы 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 я вызываю метод layout для компоновки моих UIViews, затем я настраиваю изображение внутри UIImageView. Далее, в методе рисования родительского UIView я вычисляю contentClippingRect из UIImageView , а затем снова устанавливаю ограничения UIImageView на contentClippingRect и макет.

Мой метод компоновки сбрасывает ограничения 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. Можете ли вы также привести пример ожидаемого поведения?

2. Ожидаемое поведение должно быть таким, как на изображении, но граница UIImageView должна быть на изображении

Ответ №1:

Вы также можете настроить формат по размеру из раскадровки. Перейдите в инспектор атрибутов этого ImageView, там вы найдете режим содержимого. вот примервведите описание изображения здесь

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

для swift

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

для objective c

 yourimageView.contentMode = UIViewContentModeScaleAspectFit;
  

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

 UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit,     
UIViewContentModeScaleAspectFill,   
UIViewContentModeRedraw,             
UIViewContentModeCenter,              
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
  

Комментарии:

1. Да, я знаю, и я использую это, но ImageView должен получить размер своего изображения из-за границы ImageView.

2. устанавливаете ли вы ограничения для его высоты или ширины?

3. при вызове setpictureframe() и в layout, когда image == nil, uiview получит фрейм контейнера