Câu trả lời:
Bây giờ bạn có thể tham chiếu hình ảnh của mình theo tên của nó, giống như bất kỳ tệp .png nào .
UIImage(named: "myImage")
Hỗ trợ vectơ khó hiểu trong Xcode, bởi vì khi hầu hết mọi người nghĩ về vectơ, họ nghĩ về hình ảnh có thể mở rộng lên xuống mà vẫn trông đẹp. Tuy nhiên, Xcode 6 và 7 không có hỗ trợ vector đầy đủ cho iOS, vì vậy mọi thứ hoạt động hơi khác một chút.
Hệ thống vector thực sự đơn giản . Phải mất của bạn .pdf
hình ảnh, và tạo ra @1x.png
, @2x.png
và @3x.png
tài sản tại thời gian xây dựng . (Bạn có thể sử dụng một công cụ để kiểm tra nội dung của Assets.car để xác minh điều này.)
Ví dụ: giả sử bạn được cho foo.pdf
là tài sản vectơ 44x44. Tại thời điểm xây dựng, nó sẽ tạo ra các tệp sau:
foo@1x.png
tại 44x44foo@2x.png
tại 88x88foo@3x.png
ở 132x132Điều này hoạt động tương tự cho bất kỳ hình ảnh kích thước. Ví dụ: nếu bạn có bar.pdf
100x100, bạn sẽ nhận được:
bar@1x.png
ở 100x100bar@2x.png
ở 200x200bar@3x.png
ở 300x300resizableImageWithCapInsets:
và chia các giá trị lát của mình cho[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)];
Đây là phần bổ sung cho câu trả lời xuất sắc của @Senseful.
Tôi sẽ nói làm thế nào để làm điều này trong Inkscape vì nó là nguồn mở và miễn phí nhưng các chương trình khác nên tương tự.
Trong Inkscape:
Ghi chú:
Nếu bạn đã có một hình ảnh .svg có kích thước trang sai, hãy làm như sau:
Để chuyển đổi tệp .svg thành .pdf, bạn cũng có thể tìm các tiện ích trực tuyến để thực hiện công việc cho mình. Đây là một ví dụ từ câu trả lời này . Điều này có lợi ích là cho phép bạn đặt kích thước .pdf dễ dàng.
Đối với những người vẫn chưa được cập nhật, đã có thay đổi trong Xcode 9 (iOS 11).
Có gì mới trong Ca cao cảm ứng (Phiên WWDC 2017 201) (@ 32: 55) https://developer.apple.com/ideo/play/wwdc2017/201/
Nói một cách ngắn gọn, Danh mục tài sản hiện bao gồm hộp kiểm mới trong Trình kiểm tra thuộc tính có tên là Bảo tồn dữ liệu vectơ. Khi được chọn, dữ liệu PDF sẽ được đưa vào tệp nhị phân được biên dịch, tăng kích thước của khóa học. Nhưng nó mang lại cơ hội cho iOS mở rộng dữ liệu vectơ theo cả hai hướng và cung cấp hình ảnh đẹp. (Với những khó khăn riêng). Đối với iOS dưới 11, các cơ chế chia tỷ lệ cũ được mô tả trong câu trả lời trở lên được sử dụng.
Bạn có thể sử dụng các tệp PDF bình thường bên trong dự án của mình dưới dạng hình ảnh Vector và hiển thị hình ảnh có kích thước bất kỳ bằng cách sử dụng tiện ích mở rộng này. Cách này tốt hơn vì iOS sẽ không tạo hình ảnh .PNG từ các tệp PDF của bạn, ngoài ra bạn có thể hiển thị hình ảnh với bất kỳ kích thước nào bạn muốn:
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
}
}
}