Как векторные изображения работают в Xcode (т. е. pdf-файлы)?



Как векторная поддержка работает в Xcode 6?



когда я пытаюсь изменить размер изображения, оно выглядит неровным, что дает?

624   5  

5 ответов:

как использовать векторы в Xcode (7 и 6,3+):

  1. Сохранить Изображение как .pdf файл с соответствующим размером @1x (например, 44x44 для кнопки панели инструментов).
  2. в своем картинки.xcassets.
  3. теперь вы можете ссылаться на свое изображение по его имени, как и любой .png (например, если в iOS 9 Apple начинает требовать @ 4X активов, они будут просто работать), и у вас будет меньше файлов поддерживать.

  4. вы должны запросить все ваши активы в размере @1x, сохраненные в виде PDF-файлов. Среди прочего, это позволит UIImageViews иметь правильный внутренний контент размер.
  5. почему это (вероятно) работает таким образом:

  • это обратная совместимость С предыдущими версиями iOS.
  • изменение размеров векторов может быть вычислительной интенсивной задачей во время выполнения; реализуя его таким образом,нет производительности.

в Xcode 8 вы все еще можете добавить pdf, создать новый набор изображений и в Инспекторе атрибутов установить параметр масштабирование в один масштаб. enter image description here

Это дополнение к отличному ответу от @Senseful.

Как сделать векторные изображения в .формат pdf

Я расскажу, как это сделать в Inkscape, так как это бесплатно и с открытым исходным кодом, но другие программы должны быть похожи.

В Inkscape:

  1. создать новый проект.
  2. перейдите к файлу > свойства документа и установите пользовательский размер страницы на любой размер вашего @1x (44x44, 100x100 и т. д.) с единицами в ПХ.
  3. Сделайте ваше художественное произведение.
  4. перейти к файлу > Сохранить как... > Формат Документа Для Печати (*.pdf) > сохранить > ОК. (Кроме того, вы можете перейти в меню печать > печать в файл > формат вывода: PDF > печать, но вариантов не так много.)

Примечания:

  • как указано в принятом ответе, вы не можете изменить размер изображения, потому что Xcode по-прежнему создает растрированные изображения во время сборки. Если вам нужно изменить размер изображения вы должны сделать новый .PDF-файл с другим размером.
  • Если у вас уже есть .svg изображение, которое имеет неправильный размер страницы, выполните следующие действия:

    1. изменить размер страницы (Inkscape > File > Document Properties)
    2. выберите все объекты (Ctrl+A) в рабочем пространстве и измените их размер, чтобы они соответствовали новому размеру страницы. (Удерживайте нажатой клавишу Ctrl, чтобы сохранить размер аспекта.)
  • для преобразования an .svg файл в a .pdf вы также можете найти онлайн утилиты, чтобы сделать работу за вас. вот один пример С ответ. Это имеет то преимущество, что позволяет установить .размер pdf легко.

более дальнеишее чтение

для тех, кто еще не обновился, были внесены изменения в Xcode 9 (iOS 11).

Что нового в Cocoa Touch (WWDC 2017 Session 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
    }
}

}

Comments

    Ничего не найдено.