Ответы:
Теперь вы можете ссылаться на свое изображение по его имени, как и любой другой файл .png .
UIImage(named: "myImage")
Векторная поддержка сбивает с толку в Xcode, потому что, когда большинство людей думает о векторах, они думают об изображениях, которые могут увеличиваться и уменьшаться и при этом хорошо выглядеть. Тем не менее, Xcode 6 и 7 не имеют полной векторной поддержки iOS, поэтому все работает немного по-другому.
Система векторов действительно проста . Он берет свой .pdf
образ, и создает @1x.png
, @2x.png
и @3x.png
активы на время сборки . (Вы можете использовать инструмент для проверки содержимого Assets.car, чтобы убедиться в этом.)
Например, предположим, что вам дан foo.pdf
вектор, который является векторным активом 44x44. Во время сборки он сгенерирует следующие файлы:
foo@1x.png
в 44x44foo@2x.png
в 88x88foo@3x.png
в 132x132Это работает так же для любого размера изображения. Например, если у вас есть bar.pdf
100x100, вы получите:
bar@1x.png
в 100x100bar@2x.png
в 200x200bar@3x.png
в 300x300resizableImageWithCapInsets:
и разделяя значения среза на[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)];
Это дополнение к отличному ответу @Senseful.
Я расскажу, как это сделать в 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-файлов, плюс вы можете отображать изображения любого размера, который вам нужен:
extension UIImage {
static func fromPDF(filename: String, size: CGSize) -> UIImage? {
guard let path = Bundle.main.path(forResource: filename, ofType: "pdf") else { return nil }
let url = URL(fileURLWithPath: path)
guard let document = CGPDFDocument(url as CFURL) else { return nil }
guard let page = document.page(at: 1) else { return nil }
let imageRect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
if #available(iOS 10.0, *) {
let renderer = UIGraphicsImageRenderer(size: size)
let img = renderer.image { ctx in
UIColor.white.withAlphaComponent(0).set()
ctx.fill(imageRect)
ctx.cgContext.translateBy(x: 0, y: size.height)
ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
ctx.cgContext.concatenate(page.getDrawingTransform(.artBox, rect: imageRect, rotate: 0, preserveAspectRatio: true))
ctx.cgContext.drawPDFPage(page);
}
return img
} else {
// Fallback on earlier versions
UIGraphicsBeginImageContextWithOptions(size, false, 2.0)
if let context = UIGraphicsGetCurrentContext() {
context.interpolationQuality = .high
context.setAllowsAntialiasing(true)
context.setShouldAntialias(true)
context.setFillColor(red: 1, green: 1, blue: 1, alpha: 0)
context.fill(imageRect)
context.saveGState()
context.translateBy(x: 0.0, y: size.height)
context.scaleBy(x: 1.0, y: -1.0)
context.concatenate(page.getDrawingTransform(.cropBox, rect: imageRect, rotate: 0, preserveAspectRatio: true))
context.drawPDFPage(page)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
return nil
}
}
}