Відповіді:
Тепер ви можете посилатися на своє зображення за назвою, як і будь-який .png файл.
UIImage(named: "myImage")
Векторна підтримка є незрозумілою в Xcode, оскільки коли більшість людей думає про вектори, вони думають про зображення, які можуть масштабуватися вгору і вниз і все ще виглядати добре. Однак Xcode 6 і 7 не мають повної векторної підтримки для iOS, тому все працює трохи інакше.
Векторна система справді проста . Він бере свій .pdf
образ, і створює @1x.png
, @2x.png
і @3x.png
активи на час збирання . (Ви можете скористатися інструментом для вивчення вмісту Assets.car, щоб перевірити це.)
Наприклад, припустимо, що вам надано, foo.pdf
що є векторним об'єктом 44x44. Під час збирання він генерує такі файли:
foo@1x.png
в 44х44foo@2x.png
в 88х88foo@3x.png
в 132х132Це працює однаково для будь-якого розміру зображення. Наприклад, якщо у вас bar.pdf
є 100x100, ви отримаєте:
bar@1x.png
в 100х100bar@2x.png
в 200х200bar@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 Session 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
}
}
}