Каталог активов 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.

Супер простое решение, которое мне очень помогло:

  1. Никогда не устанавливайте свойство UIImageView image в Интерфейсном Разработчике, просто оставьте его пустым.
  2. Установите значение 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)