Каталог активов Xcode 9 Сохраняет векторные данные не работает?
Я думал, что новый флажок "Сохранять векторные данные" в каталоге активов Xcode 9, наконец, даст нам изменение размеров векторных изображений в формате PDF, но, видимо, нет. Здесь мое тестовое изображение видно при двух масштабированиях в Preview:
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Приятный и острый с большим количеством зумов, так что это векторное изображение. Но вот, как выглядят два изображения в моем приложении:
![введите описание изображения здесь]()
Итак, где мои векторные данные? Неужели эта очень желаемая функция все еще отсутствует в действии? Работает ли он только для автоматически созданных изображений 2x и 3x? И если да, то что указывает флажок "Сохранять векторные данные", что мы еще не сделали этого?
Ответы
Ответ 1
Это работает, но только если вы выполняете изменение размера самостоятельно:
![enter image description here]()
Это было достигнуто в коде, например так:
let im = UIImage(named:"Image")!
let r = UIGraphicsImageRenderer(size:self.iv2.bounds.size)
let im2 = r.image {
_ in
im.draw(in: self.iv2.bounds)
}
self.iv2.image = im2
self.iv2.contentMode = .center
Таким образом, UIImageView будет растеризоваться по мере масштабирования (например, для Aspect Fit), но рисование в коде сохранит векторные данные.
РЕДАКТИРОВАТЬ Новое в Xcode 9 beta 5, теперь это работает как положено! На этом снимке экрана второй вид изображения просто масштабируется, не больше. Мы резко изменили размер!
![enter image description here]()
РЕДАКТИРОВАТЬ Играя с Xcode 11, я наконец нашел формулу, которая всегда работает. Это означает, что при запуске без дополнительного кода в представлении изображения или в другом месте векторное изображение выглядит четким при любом размере.
В каталоге ресурсов необходимо установить во всплывающем меню "Шкалы" значение "Отдельные масштабы" и поместить векторное изображение в слот 1x. Установите флажок Сохранить векторные данные. Готово.
Ответ 2
Изменить: все тот же глючное поведение в Xcode 9 GM (9A235)
На сегодняшний день (Xcode 9 beta 6 9M214v) изображение будет отображаться правильно (не размыто), если UIImageView имеет как минимум 3 ограничения, связанные с расстоянием.
например. расстояние слева, расстояние справа, расстояние сверху и другое ограничение для определения высоты UIImageView.
![enter image description here]()
Также обратите внимание, что полное отключение autolayout приведет к неправильной визуализации всего UIImageView.
Я заполнил rdar://34306192 (http://www.openradar.me/radar?id=4968083747766272) для этой ошибки.
Ответ 3
У меня была одна и та же проблема несколько раз с новым Preserves Vector Data
.
Супер простое решение, которое мне очень помогло:
- Никогда не устанавливайте свойство
UIImageView
image
в Интерфейсном Разработчике, просто оставьте его пустым.
- Установите значение
image
программно.
Надеюсь, это поможет.
Ответ 4
В моем случае (Xcode 9.4.1) с imageView
созданным в Интерфейсном Разработчике - я заметил, что, когда я первоначально прибываю на экран, изображение размыто. Если я затем изменю ориентацию устройства, изображение становится четким. Я попытался вызвать различные методы вручную в viewDidLoad()
и вот что я нашел до сих пор:
Это сработало:
let image = imageView.image
imageView.image = nil
imageView.image = image
Ни один из них не работал:
imageView.layoutSubviews()
imageView.layoutMarginsDidChange()
imageView.setNeedsLayout()
imageView.setNeedsDisplay()
imageView.reloadInputViews()
imageView.updateConstraints()
imageView.contentMode = .center ; imageView.contentMode = .scaleToFill
Вы, конечно, должны расширить или UIImageView
подкласс UIImageView
если будете часто его вызывать, например, вот так
class UIImageViewWithPreserveVectorDataFix: UIImageView {
override func awakeFromNib() {
super.awakeFromNib()
let image = self.image
self.image = nil
self.image = image
}
}
(и затем, конечно, установите UIImageViewWithPreserveVectorDataFix
в качестве класса в Интерфейсном UIImageViewWithPreserveVectorDataFix
)