#swift #uiimageview
#swift #uiimageview
Вопрос:
Я хочу, чтобы UIImageView
контейнер заполнялся как можно больше, но изображение внутри него должно сохранять свое соотношение сторон, а контейнер должен соответствовать размеру изображения внутри него.
Вот картинка того, как это происходит прямо сейчас, когда это не будет работать:
Я решил проблему, но только при первой загрузке представления, когда я меняю изображение ImageView, оно становится все меньше и меньше.
Я решил это с помощью этого расширения:
Итак, при получении 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 получит фрейм контейнера