В вашем файле Images.xcassets создайте новый набор изображений .
В Инспекторе Атрибутов установите Коэффициенты Масштабирования на Единственный Вектор .
Перетащите PDF-файл в раздел « Все, универсальный ».
Теперь вы можете ссылаться на свое изображение по его имени, как и любой другой файл .png .
UIImage(named:"myImage")
Как использовать векторы в старых версиях Xcode (6.0 - 6.2):
Выполните шаги, описанные выше, за исключением шага 3, установите Типы на Векторы .
Как работают векторы в Xcode
Векторная поддержка сбивает с толку в Xcode, потому что, когда большинство людей думает о векторах, они думают об изображениях, которые могут увеличиваться и уменьшаться и при этом хорошо выглядеть. Тем не менее, Xcode 6 и 7 не имеют полной векторной поддержки iOS, поэтому все работает немного по-другому.
Например, предположим, что вам дан foo.pdfвектор, который является векторным активом 44x44. Во время сборки он сгенерирует следующие файлы:
foo@1x.png в 44x44
foo@2x.png в 88x88
foo@3x.png в 132x132
Это работает так же для любого размера изображения. Например, если у вас есть bar.pdf100x100, вы получите:
bar@1x.png в 100x100
bar@2x.png в 200x200
bar@3x.png в 300x300
Последствия:
Вы не можете выбрать новый размер для изображения ; это будет хорошо смотреться, только если вы сохраните размер 44х44. Причина в том, что полная поддержка векторов не реализована . Единственное, что делают эти векторы, это экономит ваше время сохранения ваших изображений. Если у вас есть инструмент (например, скрипт Photoshop), который уже делает этот процесс одношаговым, единственное, что вы получите, используя векторы pdf, - это поддержка будущего (например, если в iOS 9 Apple начинает требовать ресурсы @ 4x, они просто будут работать), и у вас будет меньше файлов для обслуживания .
Вы должны запросить все ваши активы в размере @ 1x, сохраненные в виде файлов PDF . Среди прочего, это позволит UIImageViews иметь правильный внутренний размер контента.
Почему это (вероятно) работает так:
Это делает его обратно совместимым с предыдущими версиями iOS.
Изменение размеров векторов может быть сложной вычислительной задачей во время выполнения; реализовав это таким образом, вы не столкнетесь с производительностью .
Ницца пиши. Это обсуждается на Сессии 411 WWDC 2014 года «Что нового в Интерфейсном Разработчике» во время 44:13. Обратите внимание, что они говорят, что растеризация выполняется во время сборки. Также интересно на MAC это будет использовать векторы во время выполнения. В какой-то отдаленной точке в будущем, надеюсь, iOS тоже будет.
Майк Восселлер
15
К сожалению, это не масштабирует значения среза. Так что, если вы нарежете углы на 5, это не увеличит его до 10 и 15 для 2х и 3х изображений.
Джесси
5
@Jesse, если вы хотите масштабировать значения среза, вы можете сделать это самостоятельно в коде, используя resizableImageWithCapInsets:и разделяя значения среза на[UIScreen mainScreen].scale
Arie Litovsky
1
Чтобы прояснить предложение @ArieLitovsky о нарезке: вы должны удалить срезание из ресурса и переместить его в код, что-то вродеCGFloat scale = [UIScreen mainScreen].scale; UIImage *image = [[UIImage imageNamed:@"my_unsliced_asset"] resizableImageWithCapInsets:UIEdgeInsetsMake(10 * scale, 11 * scale, 12 * scale, 13 * scale)];
гляк
6
Как мне сделать это для XCode 8? вариант, похоже, исчез!
Джеральд
26
В Xcode 8 вы все еще можете добавить PDF-файл, создать новый набор изображений, а в инспекторе атрибутов установить параметр «Масштабировать в один масштаб».
Я расскажу, как это сделать в Inkscape, поскольку он бесплатный и с открытым исходным кодом, но другие программы должны быть похожими.
В Inkscape:
Создать новый проект.
Перейдите в «Файл»> «Свойства документа» и задайте для пользовательского размера страницы любой размер @ 1x (44x44, 100x100 и т. Д.) С единицами измерения в пикселях.
Сделайте свою работу.
Перейдите в Файл> Сохранить как ...> Формат документа для печати (* .pdf)> Сохранить> ОК. (Можно также выбрать «Печать»> «Печать в файл»> «Формат вывода: PDF> Печать», но вариантов не так много.)
Ноты:
Как упомянуто в принятом ответе, вы не можете изменить размер своего изображения, потому что XCode все еще производит растеризованные изображения во время сборки. Если вам нужно изменить размер изображения, вы должны создать новый файл .pdf другого размера.
Если у вас уже есть изображение .svg с неправильным размером страницы, сделайте следующее:
Изменить размер страницы (Inkscape> Файл> Свойства документа)
Выделите все объекты (Ctrl + A) в рабочей области и измените их размер, чтобы соответствовать новому размеру страницы. (Удерживайте Ctrl, чтобы сохранить размер аспекта.)
Чтобы преобразовать файл .svg в формат .pdf, вы также можете найти онлайн-утилиты, которые сделают эту работу за вас. Вот один пример из этого ответа . Преимущество этого состоит в том, что вы можете легко установить размер .pdf.
В двух словах, каталог активов теперь включает новый флажок в инспекторе атрибутов под названием «Сохранить векторные данные». Если этот флажок установлен, данные PDF будут включены в скомпилированный двоичный файл, что, конечно, увеличит его размер. Но это дает iOS возможность масштабировать векторные данные в обоих направлениях и получать красивые изображения (со своими собственными трудностями). Для iOS ниже 11 используются старые механизмы масштабирования, описанные в ответах вверх.
Вы можете использовать обычные PDF-файлы внутри вашего проекта в качестве векторных изображений и рендерить изображения любого размера, используя это расширение. Этот способ намного лучше, потому что iOS не будет генерировать изображения .PNG из ваших PDF-файлов, плюс вы можете отображать изображения любого размера, который вам нужен:
Я пробовал это, но не похоже, что он масштабирует изображение до больших размеров пикселей? Сам UIImage, который я получаю, имеет правильный размер; просто векторное изображение центрируется и все еще имеет исходный размер в пикселях PDF. (Я хотел масштабировать его до размера UIImage.) Вы знаете, возможно ли это?
resizableImageWithCapInsets:
и разделяя значения среза на[UIScreen mainScreen].scale
CGFloat scale = [UIScreen mainScreen].scale; UIImage *image = [[UIImage imageNamed:@"my_unsliced_asset"] resizableImageWithCapInsets:UIEdgeInsetsMake(10 * scale, 11 * scale, 12 * scale, 13 * scale)];
В Xcode 8 вы все еще можете добавить PDF-файл, создать новый набор изображений, а в инспекторе атрибутов установить параметр «Масштабировать в один масштаб».
источник
Это дополнение к отличному ответу @Senseful.
Как сделать векторные изображения в формате .pdf
Я расскажу, как это сделать в Inkscape, поскольку он бесплатный и с открытым исходным кодом, но другие программы должны быть похожими.
В Inkscape:
Ноты:
Если у вас уже есть изображение .svg с неправильным размером страницы, сделайте следующее:
Чтобы преобразовать файл .svg в формат .pdf, вы также можете найти онлайн-утилиты, которые сделают эту работу за вас. Вот один пример из этого ответа . Преимущество этого состоит в том, что вы можете легко установить размер .pdf.
дальнейшее чтение
источник
Для тех, кто еще не обновился, были внесены изменения в Xcode 9 (iOS 11).
Что нового в Cocoa Touch (WWDC 2017, Сессия 201) (@ 32: 55) https://developer.apple.com/videos/play/wwdc2017/201/
В двух словах, каталог активов теперь включает новый флажок в инспекторе атрибутов под названием «Сохранить векторные данные». Если этот флажок установлен, данные PDF будут включены в скомпилированный двоичный файл, что, конечно, увеличит его размер. Но это дает iOS возможность масштабировать векторные данные в обоих направлениях и получать красивые изображения (со своими собственными трудностями). Для iOS ниже 11 используются старые механизмы масштабирования, описанные в ответах вверх.
источник
Вы можете использовать обычные PDF-файлы внутри вашего проекта в качестве векторных изображений и рендерить изображения любого размера, используя это расширение. Этот способ намного лучше, потому что iOS не будет генерировать изображения .PNG из ваших PDF-файлов, плюс вы можете отображать изображения любого размера, который вам нужен:
источник