Как работает векторная поддержка в 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. В время сборки он будет генерировать следующие файлы:
[email protected]
в 44x44[email protected]
при 88x88[email protected]
на 132x132Это работает одинаково для любого размера изображения. Например, если у вас есть bar.pdf
, который равен 100x100, вы получите:
[email protected]
при 100x100[email protected]
при 200x200[email protected]
при 300x300В Xcode 8 вы все равно можете добавить PDF файл, создать новый набор изображений и в инспекторе атрибутов установить параметр "Масштабы в единую шкалу".
Это дополнение к отличному ответу @Senseful.
Я расскажу, как это сделать в Inkscape, так как это бесплатный и открытый исходный код, но другие программы должны быть похожими.
В Inkscape:
Примечания:
Если у вас уже есть изображение .svg, которое является неправильным размером страницы, выполните следующие действия:
Чтобы преобразовать файл .svg в .pdf, вы также можете найти онлайн-утилиты для выполнения этой работы. Вот один пример из этого ответа. Это дает вам возможность легко установить размер .pdf.
Вы можете использовать обычные 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
}
}
}