Bagaimana cara kerja dukungan vektor di Xcode 6?
Ketika saya mencoba mengubah ukuran gambar, terlihat bergerigi, apa yang terjadi?
Bagaimana cara kerja dukungan vektor di Xcode 6?
Ketika saya mencoba mengubah ukuran gambar, terlihat bergerigi, apa yang terjadi?
Jawaban:
Anda sekarang dapat merujuk ke gambar Anda dengan namanya, seperti yang Anda lakukan pada file .png .
UIImage(named: "myImage")
Dukungan vektor membingungkan dalam Xcode, karena ketika kebanyakan orang memikirkan vektor, mereka memikirkan gambar yang dapat naik turun dan masih terlihat bagus. Namun, Xcode 6 dan 7 tidak memiliki dukungan vektor penuh untuk iOS, jadi semuanya berjalan sedikit berbeda.
Sistem vektor sangat sederhana . Dibutuhkan Anda .pdf
gambar, dan menciptakan @1x.png
, @2x.png
dan @3x.png
aset pada waktu membangun . (Anda dapat menggunakan alat untuk memeriksa konten Assets.car untuk memverifikasi ini.)
Misalnya, anggap Anda diberi foo.pdf
aset vektor 44x44. Pada saat membangun akan menghasilkan file-file berikut:
foo@1x.png
pada 44x44foo@2x.png
pada 88x88foo@3x.png
pada 132x132Ini berfungsi sama untuk ukuran gambar apa pun. Misalnya, jika Anda memiliki bar.pdf
yang 100x100, Anda akan mendapatkan:
bar@1x.png
pada 100x100bar@2x.png
pada 200x200bar@3x.png
pada 300x300resizableImageWithCapInsets:
dan membagi nilai slice Anda dengan[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)];
Ini adalah suplemen untuk jawaban yang sangat bagus oleh @Senseful.
Saya akan memberi tahu cara melakukan ini di Inkscape karena gratis dan open source tetapi program lain harus serupa.
Dalam Inkscape:
Catatan:
Jika Anda sudah memiliki gambar .svg yang ukuran halamannya salah, lakukan hal berikut:
Untuk mengonversi file .svg menjadi .pdf Anda juga dapat menemukan utilitas online untuk melakukan pekerjaan itu untuk Anda. Inilah satu contoh dari jawaban ini . Ini memiliki manfaat memungkinkan Anda untuk mengatur ukuran .pdf dengan mudah.
Bagi mereka yang masih belum memperbarui, ada perubahan di Xcode 9 (iOS 11).
Apa yang baru di Cocoa Touch (WWDC 2017 Session 201) (@ 32: 55) https://developer.apple.com/videos/play/wwdc2017/201/
Dalam beberapa kata, Katalog Aset sekarang menyertakan kotak centang baru di Inspektur Atribut bernama "Preserve Vector Data". Ketika diperiksa, data PDF akan dimasukkan dalam biner yang dikompilasi, tentu saja memperbesar ukurannya. Tapi itu memberi kesempatan bagi iOS untuk skala data vektor di kedua arah dan memberikan gambar yang bagus. (Dengan kesulitan sendiri). Untuk iOS di bawah 11, mekanisme penskalaan lama yang dijelaskan dalam jawaban di atas digunakan.
Anda dapat menggunakan file PDF normal di dalam proyek Anda sebagai gambar Vektor dan membuat gambar dari berbagai ukuran menggunakan ekstensi ini. Cara ini jauh lebih baik karena iOS tidak akan menghasilkan gambar .PNG dari file PDF Anda, plus Anda dapat membuat gambar dengan ukuran apa pun yang Anda inginkan:
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
}
}
}