.scaleAspectFit не работает с UIImageView внутри контекстного меню

#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. Спасибо, это, кажется, решило проблему. Я провел утро, пробуя все остальное! Также спасибо за объяснение. Я взгляну на отладчик иерархии пользовательского интерфейса