Odpowiedzi:
Możesz teraz odwoływać się do swojego obrazu, używając jego nazwy, tak jak do każdego pliku .png .
UIImage(named: "myImage")
Obsługa wektorów jest myląca w Xcode, ponieważ kiedy większość ludzi myśli o wektorach, myślą o obrazach, które można skalować w górę iw dół i nadal dobrze wyglądać. Jednak Xcode 6 i 7 nie mają pełnej obsługi wektorów dla iOS, więc rzeczy działają trochę inaczej.
System wektorowy jest naprawdę prosty . Zajmuje swój .pdf
wizerunek i tworzy @1x.png
, @2x.png
i @3x.png
aktywa w czasie kompilacji . (Możesz użyć narzędzia do sprawdzenia zawartości Assets.car, aby to sprawdzić).
Na przykład załóżmy, że otrzymałeś foo.pdf
zasób wektorowy 44x44. W czasie kompilacji wygeneruje następujące pliki:
foo@1x.png
przy 44x44foo@2x.png
przy 88x88foo@3x.png
przy 132x132Działa to tak samo dla każdego rozmiaru obrazu. Na przykład, jeśli masz bar.pdf
100x100, otrzymasz:
bar@1x.png
przy 100x100bar@2x.png
przy 200x200bar@3x.png
przy 300x300resizableImageWithCapInsets:
i dzieląc wartości [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)];
To uzupełnienie doskonałej odpowiedzi @Senseful.
Powiem, jak to zrobić w Inkscape, ponieważ jest darmowy i open source, ale inne programy powinny być podobne.
W Inkscape:
Uwagi:
Jeśli masz już obraz .svg o nieprawidłowym rozmiarze strony, wykonaj następujące czynności:
Aby przekonwertować plik .svg na .pdf, możesz również znaleźć narzędzia online, które wykonają to zadanie za Ciebie. Oto jeden przykład z tej odpowiedzi . Ma to tę zaletę, że umożliwia łatwe ustawienie rozmiaru .pdf.
Dla tych, którzy wciąż nie aktualizowali, nastąpiły zmiany w Xcode 9 (iOS 11).
Co nowego w Cocoa Touch (sesja 201 WWDC 2017) (@ 32:55) https://developer.apple.com/videos/play/wwdc2017/201/
Krótko mówiąc, Katalog zasobów zawiera teraz nowe pole wyboru w Inspektorze atrybutów o nazwie „Zachowaj dane wektorowe”. Gdy zaznaczone, dane PDF zostaną uwzględnione w skompilowanym pliku binarnym, oczywiście zwiększając jego rozmiar. Ale daje to szansę iOS na skalowanie danych wektorowych w obu kierunkach i dostarczanie ładnych obrazów (z własnymi trudnościami). W przypadku iOS poniżej 11 używane są stare mechanizmy skalowania opisane w odpowiedziach w górę.
Możesz używać zwykłych plików PDF w swoim projekcie jako obrazów wektorowych i renderować obrazy o dowolnym rozmiarze za pomocą tego rozszerzenia. Jest to o wiele lepsze, ponieważ iOS nie generuje obrazów .PNG z plików PDF, a ponadto możesz renderować obrazy o dowolnym rozmiarze:
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
}
}
}