Как изменить размер UIImageView на основе размера/отношения UIImage в Swift 3?
Пожалуйста, не отмечайте как дубликат, я не нашел решения, рассматривающего доступные потоки.
У меня есть UIImageView
и пользователь может загружать UIImages
в различных форматах. Проблема в том, что мне нужно, чтобы UIImageView
размер на основе заданного отношения изображения.
В настоящее время я использую Aspect fit
, но UIImageView
остается пустым на больших участках. Я бы хотел, чтобы UIImageView
размер на основе его содержимого. Например, если pic 1:1, 4: 3, 6: 2, 16: 9...
Помощь очень ценится.
По просьбе, это то, что я хочу:
У меня был UIImageView
который был квадратным, загруженный с изображением в UIImageView
16: 7 или любым UIImageView
а UIImageView
в соответствии с размером изображения...
Ответы
Ответ 1
Похоже, вы хотите изменить размер ImageView в соответствии с соотношением изображений и размером контейнера, вот пример в Swift (извините, бывший ответ с ошибкой, я исправил его):
let containerView = UIView(frame: CGRect(x:0,y:0,width:320,height:500))
let imageView = UIImageView()
if let image = UIImage(named: "a_image") {
let ratio = image.size.width / image.size.height
if containerView.frame.width > containerView.frame.height {
let newHeight = containerView.frame.width / ratio
imageView.frame.size = CGSize(width: containerView.frame.width, height: newHeight)
}
else{
let newWidth = containerView.frame.height * ratio
imageView.frame.size = CGSize(width: newWidth, height: containerView.frame.height)
}
}
Ответ 2
Я потратил много часов, пытаясь найти решение той же проблемы, с которой вы столкнулись, и это единственное решение, которое сработало для меня (Swift 4, xCode 9.2):
class ScaledHeightImageView: UIImageView {
override var intrinsicContentSize: CGSize {
if let myImage = self.image {
let myImageWidth = myImage.size.width
let myImageHeight = myImage.size.height
let myViewWidth = self.frame.size.width
let ratio = myViewWidth/myImageWidth
let scaledHeight = myImageHeight * ratio
return CGSize(width: myViewWidth, height: scaledHeight)
}
return CGSize(width: -1.0, height: -1.0)
}
}
Добавьте класс в проект и установите UIImageView в пользовательский класс ScaledHeightImageView. Режим просмотра изображений - Aspect Fit.
Моя проблема такая же, как и в этой статье. Внутри моего прототипа TableViewCell ContentView у меня есть вертикальный StackView, ограниченный каждым ребром. Внутри StackView была метка, ImageView и еще одна метка. Недостаточно установить ImageView в AspectFit. Изображение будет правильным размером и пропорциями, но ImageView не обертывает фактическое изображение, оставляя кучу лишнего пространства между изображением и меткой (как и на изображении выше). Высота ImageView, по-видимому, соответствовала высоте исходного изображения, а не высоте размера изображения (после того, как aspectFit выполнил задание). Другие решения, которые я нашел, не полностью разрешали проблему по разным причинам. Я надеюсь, что это помогает кому-то.
Ответ 3
Я потратил много часов на это, и я наконец получил решение, которое сработало для меня (Swift 3):
- в IB, я установил режим содержимого UIImageView 'Aspect Fit'
- в IB, я устанавливаю ограничение ширины UIImageView равным тому, что вы хотите (в моем случае, ширина представления)
- в IB, я устанавливаю ограничение высоты UIImageView равным 0 и создаю для него реферирующий выход (скажем,
constraintHeight
)
Затем, когда мне нужно отобразить изображение, я просто пишу следующее (взятое из ответов выше):
let ratio = image.size.width / image.size.height
let newHeight = myImageView.frame.width / ratio
constraintHeight.constant = newHeight
view.layoutIfNeeded()
В принципе, это гарантирует, что изображение заполняет ширину UIImageView и заставляет высоту UIImageView быть равной высоте изображения после масштабирования
Ответ 4
Задайте свой ImageView в aspectFit, который изменит размер изображения, чтобы он не превышал рамку изображения.
Вы можете получить размер вашего UIImage вашего imageView с логикой из этого вопроса - в основном просто получите высоту и ширину UIImage.
Вычислите соотношение и установите ширину/высоту изображения в соответствии с вашим экраном.
У вас также есть аналогичный вопрос, на который вы можете получить ответ.