Каталог активов Xcode 9 Сохраняет векторные данные не работает?

Я думал, что новая галочка «Сохраняет векторные данные» в каталоге ресурсов Xcode 9 наконец-то даст нам возможность изменять размер векторных изображений PDF, но, видимо, нет. Вот мое тестовое изображение, показанное при двух увеличениях в предварительном просмотре:

введите описание изображения здесь

введите описание изображения здесь

Красивое и резкое, с большим увеличением, поэтому ясно, что это векторное изображение. Но вот как выглядят два изображения в моем приложении:

введите описание изображения здесь

Так где мои векторные данные? Эта столь желанная функция все еще отсутствует в работе? Работает ли он по-прежнему только для автоматически сгенерированных изображений 2x и 3x? И если да, то что дает нам флажок «Сохранить векторные данные», чего у нас еще не было?


person matt    schedule 10.08.2017    source источник


Ответы (4)


Изменить: все та же ошибка в Xcode 9 GM (9A235)

На сегодняшний день (Xcode 9 beta 6 9M214v) изображение будет отображаться правильно (не размытым) только в том случае, если UIImageView имеет как минимум 3 ограничения, связанные с интервалом.

например. интервал слева, интервал справа, интервал сверху и другое ограничение для определения высоты UIImageView.

введите описание изображения здесь

Также обратите внимание, что полное отключение автоматического раскладки приведет к некорректному рендерингу всего UIImageView.

Я залил rdar: // 34306192 (http://www.openradar.me/radar?id=4968083747766272) для этой ошибки.

person Guillaume Algis    schedule 07.09.2017
comment
Год спустя с iOS 12 и Xcode 10 GM все по-прежнему. Теперь потрачены впустую часы на поиск этой проблемы. Конечно, Apple - небольшая гаражная компания, у которой нет ресурсов для исправления ошибок (или, по крайней мере, их документирования). - person ernesto; 23.10.2018
comment
@ernesto, тогда, пожалуйста, подумайте о том, чтобы обмануть мой радар, спасибо! - person Guillaume Algis; 23.10.2018
comment
Есть ли быстрый способ обмануть его, не описывая ошибку своими словами, а также не предоставляя тестовый пример? - person ernesto; 24.10.2018
comment
@ernesto конечно, вы можете загрузить Brisk и использовать Cmd + Shift + N для создания дубликата, указав мой идентификатор радара: 34279759 - person Guillaume Algis; 24.10.2018
comment
Есть обновления по этому поводу? По-прежнему нет решения, чтобы заставить его работать без упомянутых обходных путей? - person Stas Ivanov; 12.12.2018
comment
@StasIvanov Неа. Мои радары закрыты как дубликаты, но исходные радары по-прежнему помечены как открытые. Лучшее, что вы можете сделать, чтобы ускорить процесс, - это обмануть радар, чтобы дать Apple понять, что им нужно это исправить. - person Guillaume Algis; 12.12.2018

У меня несколько раз возникала одна и та же проблема с новым Preserves Vector Data.

Супер простое решение, которое очень хорошо сработало для меня:

  1. Никогда не устанавливайте свойство UIImageView image в Интерфейсном Разработчике, просто оставьте его пустым.
  2. Установите значение image программно.

Надеюсь, это поможет.

person Fmessina    schedule 18.12.2018
comment
Вот это да . Большое спасибо . Установить имя изображения в коде - это решение - person Hamid Reza Ansari; 27.03.2020
comment
Не могу поверить, что это решение! Спасибо! - person Matthias; 18.05.2020
comment
Это решение по-прежнему работает в 2020 году, спасибо! - person Evgeny Karkan; 14.07.2020

В моем случае (Xcode 9.4.1) с imageView, созданным в Interface Builder - я заметил, что когда я впервые выхожу на экран, изображение размытое. Если затем изменить ориентацию устройства, изображение станет четким. Я пробовал вручную вызывать разные методы в 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, если вы будете вызывать его часто, например, так

class UIImageViewWithPreserveVectorDataFix: UIImageView {
    override func awakeFromNib() {
        super.awakeFromNib()
        let image = self.image
        self.image = nil
        self.image = image
    }
}

(а затем, конечно, установите UIImageViewWithPreserveVectorDataFix как класс в Интерфейсном Разработчике)

person Nikolay Suvandzhiev    schedule 28.09.2018
comment
Отличное исследование, спасибо! Интересно, связано ли это: stackoverflow.com/a/50787278/341994 - person matt; 28.09.2018

Это работает, но только если вы сами изменяете размер:

введите здесь описание изображения

Это было достигнуто в коде, например:

    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, теперь это работает должным образом! На этом снимке экрана второе изображение просто масштабируется до заливки, не более того. Резко меняем размер!

введите здесь описание изображения

РЕДАКТИРОВАТЬ. Играя с Xcode 11, я наконец нашел формулу, которая всегда работает. Это означает, что при запуске, без дополнительного кода, в режиме просмотра изображения или где-либо еще, векторное изображение выглядит резким при любом размере.

В каталоге активов вы должны установить во всплывающем меню «Масштаб» значение «Индивидуальные масштабы» и поместить векторное изображение в слот 1x. Установите флажок «Сохранить векторные данные». Выполнено.

person matt    schedule 10.08.2017
comment
вы используете два обычных UIImageView без кода? Кажется, у меня нет двух изображений для рендеринга без растеризации с помощью Xcode 9b6 ... - person Guillaume Algis; 06.09.2017
comment
@GuillaumeAlgis Да! Это всего лишь два обычных изображения, код не требуется. Вы не забыли проверить сохранение векторных данных? - person matt; 06.09.2017
comment
да, я это проверил :(. При использовании предоставленного вами фрагмента я получаю четкое изображение, но при двух обычных просмотрах изображения у большого появляется псевдоним. Возможно, мне следует отправить радар с прикрепленным образцом проекта: / - person Guillaume Algis; 06.09.2017
comment
Мои образы обычные. Вы хотите, чтобы я отправил вам пример? Было бы глупо отправлять это сейчас как отчет об ошибке; ошибка исправлена. - person matt; 06.09.2017
comment
Конечно, я хотел бы получить пример! Спасибо! Не могли бы вы отправить его на guillaume.algis через Gmail, пожалуйста? - person Guillaume Algis; 06.09.2017
comment
Отправлено. Дайте мне знать, что вы думаете. - person matt; 06.09.2017
comment
Спасибо, Мэтт! Похоже, есть ошибка с автоматическим размещением, связанная с той, которую я заполнил сегодня: openradar.me/radar ? id = 5005434293321728. Короче говоря, если UIImageView имеет менее 3 ограничений, связанных с интервалом, он будет отображаться неправильно. В противном случае он работает нормально (так что это сработало для вас, потому что у вас есть верхнее, левое и правое ограничения для вашего UIImageView). Вот результат на моем компьютере: imgur.com/DpLd15i. Верхнее изображение имеет 2 ограничения, нижнее - 3 + высота. Дайте мне знать, если вы тоже можете воспроизвести это, пожалуйста, спасибо! - person Guillaume Algis; 06.09.2017
comment
Очень крутой снимок экрана! Но у меня есть один вопрос: вы использовали View Debugger? Мне кажется, что у вас могут быть неоднозначные ограничения. - person matt; 06.09.2017
comment
Я этого не делал, но я только что проверил, и, к сожалению, у меня нет неоднозначного макета :(. Его легко воспроизвести, если у него есть представление изображения с фиксированной шириной и высотой и выровнено по горизонтали и вертикали в своем контейнере. - person Guillaume Algis; 06.09.2017
comment
Спасибо за проверку! Это звучит как действительно отличный отчет об ошибке; спасибо за подачу и поздравляем с отличным исследованием. Не стесняйтесь добавить второй ответ на мой вопрос, указав, что исправление не работает при определенных типах автоматического размещения. - person matt; 06.09.2017