Yanıtlar:
Artık herhangi bir .png dosyasında yaptığınız gibi resminize adıyla başvurabilirsiniz .
UIImage(named: "myImage")
Vektör desteği Xcode'da kafa karıştırıcıdır, çünkü çoğu insan vektörleri düşündüğünde, yukarı ve aşağı ölçeklenebilen ve hala iyi görünen görüntüleri düşünürler. Bununla birlikte, Xcode 6 ve 7'nin iOS için tam vektör desteği yoktur, bu nedenle işler biraz farklı çalışır.
Vektör sistemi gerçekten basittir . Bu sizin sürer .pdf
görüntü ve yaratır @1x.png
, @2x.png
ve @3x.png
de varlık oluşturma zaman . (Bunu doğrulamak için Assets.car içeriğini incelemek için bir araç kullanabilirsiniz .)
Örneğin, foo.pdf
44x44 vektör öğesi olan size verildiğini varsayalım . At yapı anda aşağıdaki dosyaları oluşturur:
foo@1x.png
44x44'tefoo@2x.png
88x88'defoo@3x.png
132x132'deBu, herhangi bir boyuttaki görüntü için aynı şekilde çalışır. Örneğin bar.pdf
, 100x100 olanı varsa , şunları elde edersiniz:
bar@1x.png
100x100'debar@2x.png
200x200'debar@3x.png
300x300'deresizableImageWithCapInsets:
ve bölerek kodda kendiniz yapabilirsiniz[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)];
Bu, @Senseful'ın mükemmel cevabına bir ektir.
Inkscape'te bunu nasıl yapacağımı anlatacağım çünkü ücretsiz ve açık kaynaklıdır, ancak diğer programlar benzer olmalıdır.
Inkscape'te:
Notlar:
Zaten yanlış sayfa boyutunda bir .svg resminiz varsa, aşağıdakileri yapın:
Bir .svg dosyasını bir .pdf dosyasına dönüştürmek için, işi sizin için yapacak çevrimiçi yardımcı programları da bulabilirsiniz. İşte bir örnek dan bu cevap . Bu, .pdf boyutunu kolayca ayarlamanıza olanak tanır.
Hala güncelleme yapmamış olanlar için Xcode 9'da (iOS 11) değişiklikler yapıldı.
Cocoa Touch'taki yenilikler (WWDC 2017 Session 201) (@ 32: 55) https://developer.apple.com/videos/play/wwdc2017/201/
Birkaç kelimeyle, Varlık Kataloğu artık "Vektör Verilerini Koru" adlı Özellik Denetçisi'ne yeni onay kutusunu ekliyor. İşaretlendiğinde, PDF verileri derlenen ikili dosyaya dahil edilecek ve elbette boyutunu artıracaktır. Ancak iOS'a vektör verilerini her iki yönde ölçekleme ve güzel görüntüler sağlama şansı verir. (Kendi zorluklarıyla). 11'in altındaki iOS için, yanıtlarda yukarı doğru açıklanan eski ölçekleme mekanizmaları kullanılır.
Projenizdeki normal PDF dosyalarını Vektör görüntüleri olarak kullanabilir ve bu uzantıyı kullanarak her boyutta görüntü oluşturabilirsiniz. Bu şekilde çok daha iyidir çünkü iOS PDF dosyalarınızdan .PNG görüntüler oluşturmaz, ayrıca istediğiniz boyutta görüntüler oluşturabilirsiniz:
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
}
}
}