#ios #swift
Вопрос:
Я пытаюсь отобразить изображение UIImageView
в контекстном меню, однако я не могу заставить работать режим содержимого представления изображения.
Размер UIImageView
соответствует изображению в 1X, однако изображение, которое я добавляю, имеет размер UIScreen.main.scale
, чтобы сделать его более четким. Я установил режим scaleAspectFit
, чтобы он правильно вписывался в представление изображения.
let viewController = UIViewController() viewController.view.backgroundColor = .red var imageToShow:UIImage = self.arrayImages[cellIndex] let screenSize: CGRect = UIScreen.main.bounds imageToShow = imageToShow.resizeImage(image: imageToShow, targetSize: CGSize(width: (screenSize.width * UIScreen.main.scale), height: (screenSize.height * UIScreen.main.scale)))! let imageViewSize = CGSize(width: (imageToShow.size.width / UIScreen.main.scale), height: (imageToShow.size.height / UIScreen.main.scale)) // 1 let imageView = UIImageView.init(frame: CGRect(x: 0, y: 0, width: imageViewSize.width, height: imageViewSize.height)) imageView.contentMode = .scaleAspectFit imageView.clipsToBounds = true imageView.image = imageToShow viewController.view = imageView // 2 imageView.translatesAutoresizingMaskIntoConstraints = false // 3 viewController.preferredContentSize = imageView.frame.size
Это почти так же, как если .scaleAspectFit
бы это игнорировалось, так как изображение никогда не уменьшается в размерах, чтобы соответствовать представлению изображения.
Это изображение с учетом коэффициента масштабирования
And this is the image without the scale factor taken into account
Редактировать
Ниже приведена функция, которую я использую для изменения размера изображения.
public func resizeImage(image: UIImage, targetSize: CGSize) -gt; UIImage? { let size = image.size let widthRatio = targetSize.width / size.width let heightRatio = targetSize.height / size.height // Figure out what our orientation is, and use that to form the rectangle var newSize: CGSize if(widthRatio gt; heightRatio) { newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio) } else { newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio) } // This is the rect that we've calculated out and this is what is actually used below let rect = CGRect(origin: .zero, size: newSize) // Actually do the resizing to the rect using the ImageContext stuff UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) image.draw(in: rect) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage }
Комментарии:
1. Просто добавлена функция изменения размера, чтобы показать, как изменяется размер изображения.
Ответ №1:
Удаление этой строки сработало для меня:
imageView.translatesAutoresizingMaskIntoConstraints = false
Эта линия устраняет ограничения на вид изображения, что делает ее положение неоднозначным, и поэтому она отображается неожиданными способами.
Я понимаю, что во время макета представление изображения «расширяется» до полного размера изображения, потому что оно никоим образом не ограничено, и это его внутренний размер содержимого. Но только поскольку предпочтительный размер содержимого установлен на размер перед расширением, видна только средняя часть изображения.
Вы можете поиграть с этим, используя отладчик иерархии пользовательского интерфейса Xcode. С помощью приведенной выше строки вы должны увидеть, что ширина и высота изображения больше, чем ожидалось, и есть предупреждение о том, что «положение изображения неоднозначно». Если вы удалите линию, ширина и высота будут такими, как ожидалось, и предупреждения не будет.
Комментарии:
1. Спасибо, это, кажется, решило проблему. Я провел утро, пробуя все остальное! Также спасибо за объяснение. Я взгляну на отладчик иерархии пользовательского интерфейса