Jak działają obrazy wektorowe w Xcode (np. pliki pdf)?

Jak działa obsługa vector w Xcode 6?

Kiedy próbuję zmienić rozmiar obrazu, wygląda on postrzępiony, co daje?

Author: Paulo Mattos, 2014-09-13

5 answers

Jak używać wektorów w Xcode (7 i 6.3+):

  1. Zapisz obrazek jako .plik pdf o odpowiednim rozmiarze @ 1x (np. 44x44 dla przycisku paska narzędzi).
  2. w Twoich obrazach.xcassets Plik, Utwórz nowy zestaw obrazów.
  3. w Inspektorze atrybutów Ustaw współczynniki skalarne na Wektor pojedynczy.
  4. przeciągnij i upuść plik pdf do sekcjiAll, Universal .
  5. Możesz teraz odnieść się do swojego obrazu po jego nazwie, tak jak każdy .plik png .

    UIImage(named: "myImage")
    

Jak używać wektorów w starszych wersjach Xcode (6.0 - 6.2):

  • wykonaj powyższe kroki, z wyjątkiem kroku 3, Ustaw typy na Wektory.

Jak działają wektory w Xcode

Obsługa wektorów jest myląca w Xcode, ponieważ kiedy większość ludzi myśli o wektorach, myślą o obrazach, które mogą skalować się w górę iw dół i nadal wyglądają dobrze. Jednakże, Xcode 6 i 7 nie mają pełnej obsługi wektorowej dla iOS, więc rzeczy działają trochę inaczej.

Układ wektorowy jest bardzo prosty . Zabiera twój .pdf obraz i tworzy @1x.png, @2x.png, i @3x.png aktywa w czasie budowy. (Możesz użyć narzędzia do sprawdzania zawartości zasobów.samochód , aby to zweryfikować.)

Na przykład, załóżmy, że masz foo.pdf, który jest zasobem wektorowym 44x44. W czasie budowy wygeneruje on następujące pliki:

To działa tak samo dla każdego rozmiaru obrazu. Na przykład, jeśli masz bar.pdf, który jest 100x100, otrzymasz:


Implikacje:

  • nie możesz wybrać nowego rozmiaru dla obrazu ; będzie dobrze wyglądać tylko wtedy, gdy zachowasz rozmiar 44x44. Powodem jest to, że pełne wsparcie wektorowe nie jest zaimplementowane . Jedyne, co robią te wektory, to oszczędność czasu zapisywania zasobów obrazu. Jeśli masz narzędzie (np. skrypt Photoshopa), które już czyni ten proces jednoetapowym, jedyną rzeczą, którą zyskasz używając wektorów pdf, jest wsparcie przyszłościowa obsługa (np. jeśli w systemie iOS 9 Apple zacznie wymagać zasobów @4x, będą one po prostu działać), a będziesz mieć mniej plików do utrzymania.
  • powinieneś poprosić o wszystkie twoje zasoby w rozmiarze @1x, zapisane jako pliki PDF . Między innymi pozwoli to UIImageViews mieć prawidłowy Wewnętrzny rozmiar zawartości.

Dlaczego to (prawdopodobnie) działa w ten sposób:

    To sprawia, że jest kompatybilny wstecz z poprzednimi wersjami iOS.
  • Zmiana rozmiaru wektorów może być zadaniem intensywnym obliczeniowo w czasie wykonywania; implementując go w ten sposób, nie ma trafień wydajności.
 325
Author: Senseful,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:50

W Xcode 8 nadal możesz dodać plik pdf, utworzyć nowy zestaw obrazów, a w Inspektorze atrybutów ustawić skale na pojedynczą skalę. Tutaj wpisz opis obrazka

 16
Author: Maria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-15 14:12:27

Jest to uzupełnienie doskonałej odpowiedzi autorstwa @ Senseful.

Jak zrobić obrazy wektorowe wFormat pdf

Powiem jak to zrobić w Inkscape, ponieważ jest wolny i open source, ale inne programy powinny być podobne.

In Inkscape:

  1. Utwórz nowy projekt.
  2. przejdź do File > Document Properties i Ustaw niestandardowy rozmiar strony na dowolny rozmiar @1x (44x44, 100x100 itp.) za pomocą jednostek w px.
  3. Make your grafika.
  4. przejdź do Plik > Zapisz jako... > Format Dokumentu Do Wydruku (*.pdf) > Zapisz > OK. (Alternatywnie możesz przejść do Drukuj > Drukuj do pliku > Format wyjściowy: PDF > Drukuj, ale nie ma tak wielu opcji.)

Uwagi:

  • Jak wspomniano w zaakceptowanej odpowiedzi, nie można zmienić rozmiaru obrazu, ponieważ Xcode nadal produkuje rasteryzowane obrazy w czasie budowy. Jeśli chcesz zmienić rozmiar obrazu, powinieneś zrobić nowy .plik pdf z innym rozmiar.
  • Jeśli już masz .obraz svg o niewłaściwym rozmiarze strony, wykonaj następujące czynności:

    1. Zmiana rozmiaru strony (Inkscape > Plik > Właściwości dokumentu)
    2. Zaznacz wszystkie obiekty (Ctrl+A) w przestrzeni roboczej i zmień ich rozmiar, aby pasowały do nowego rozmiaru strony. (Przytrzymaj Ctrl, aby zachować Rozmiar obrazu.)
  • Do konwersji an .plik svg do a .pdf możesz również znaleźć narzędzia online, które wykonają zadanie za Ciebie. oto jeden przykład z tego odpowiedź . Ma to tę zaletę, że pozwala Ci ustawić .rozmiar pdf łatwo.

Czytaj dalej

 13
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:56

Dla tych, którzy nadal nie aktualizowane, były zmiany w Xcode 9 (iOS 11).

Co nowego w Cocoa Touch (WWDC 2017 Session 201) (@32:55) https://developer.apple.com/videos/play/wwdc2017/201/

W kilku słowach katalog zasobów zawiera teraz nowe pole wyboru w Inspektorze atrybutów o nazwie "Zachowaj dane wektorowe". Gdy zaznaczone, Dane PDF zostaną włączone do skompilowanego pliku binarnego, oczywiście zwiększając jego rozmiar. Ale daje szansę iOS skalować dane wektorowe w obu wskazówki i zapewnić ładne zdjęcia.(Z własnymi trudnościami). W przypadku iOS poniżej 11 używane są stare mechanizmy skalowania opisane w odpowiedziach w górę.

 2
Author: Dren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-20 18:46:31

Możesz używać zwykłych plików PDF wewnątrz projektu jako obrazów wektorowych i renderować obrazy o dowolnym rozmiarze za pomocą tego rozszerzenia. Ten sposób jest o wiele lepszy, ponieważ iOS nie wygeneruje .Obrazy PNG z plików PDF, a także 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
    }
}

}

 0
Author: Bruno Paulino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 15:48:20