เวกเตอร์สนับสนุนทำงานใน Xcode 6 อย่างไร
เมื่อฉันลองปรับขนาดรูปภาพมันดูขรุขระสิ่งที่ให้?
เวกเตอร์สนับสนุนทำงานใน Xcode 6 อย่างไร
เมื่อฉันลองปรับขนาดรูปภาพมันดูขรุขระสิ่งที่ให้?
คำตอบ:
ตอนนี้คุณสามารถอ้างถึงรูปภาพของคุณตามชื่อของไฟล์ได้เช่นเดียวกับไฟล์. pngใด ๆ
UIImage(named: "myImage")
การสนับสนุนเวกเตอร์นั้นสร้างความสับสนให้กับ Xcode เพราะเมื่อคนส่วนใหญ่นึกถึงเวกเตอร์พวกเขาจะนึกถึงภาพที่สามารถขยายและลดขนาดได้และยังดูดีอยู่ อย่างไรก็ตาม Xcode 6 และ 7 ไม่มีการสนับสนุนเวกเตอร์เต็มรูปแบบสำหรับ iOS ดังนั้นสิ่งต่าง ๆ จะทำงานแตกต่างกันเล็กน้อย
ระบบเวกเตอร์เป็นง่ายจริงๆ มันต้องใช้เวลาของคุณ.pdf
ภาพและสร้าง@1x.png
, @2x.png
และ@3x.png
สินทรัพย์ที่เวลาในการสร้าง (คุณสามารถใช้เครื่องมือเพื่อตรวจสอบเนื้อหาของ Assets.carเพื่อตรวจสอบสิ่งนี้)
ตัวอย่างเช่นสมมติว่าคุณได้รับfoo.pdf
ซึ่งเป็นสินทรัพย์แบบเวกเตอร์ 44x44 ณเวลา buildมันจะสร้างไฟล์ต่อไปนี้:
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
}
}
}