ImageLiteral Größe festlegen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • ImageLiteral Größe festlegen

    Guten Morgen zusammen,
    heute stehe ich vor folgendem Problem:
    Mein Bild wird bei nachstehendem Code in Originalgröße angezeigt, 350x350 Pixel.

    Mein Code:
    return #imageLiteral(resourceName: "Bar.png")

    Jedoch möchte ich das Bild nur in 150x150 anzeigen lassen.
    Weiß jemand wie ich das ganze in diesem Einzeiler runter skaliere?

    Liebe Grüße,
    Ferdinand :thumbup:
  • ImageLiteral ist leider bekannt dafür erhebliche Probleme zu bereiten. Selbst über verschiedene Xcode - Versionen hinweg kann es passieren, dass Lösungen, die in der vormaligen Version funktioniert haben, plötzlich den Dienst verweigern.

    Ich würde dir raten imageLiteral in deinem Code vollständig zu meiden.
  • Wie kann ich ein ImageLiteral denn am besten durch ein "normales" Bild umgehen?
    Bzw. wie ist es möglich das von mir ausgewählte Bild dann in einer passenden Größe anzuzeigen?
    Beispielsweise ist mein Bild 250x250 Pixel groß und ich möchte es in 100x100 anzeigen.

    Mein Aktueller Code:

    Quellcode

    1. var image: UIImage {
    2. guard let name = discipline else { return #imageLiteral(resourceName: "Flag") }
    3. switch name {
    4. case "Monument":
    5. return#imageLiteral(resourceName: "Flagge1.png")
    6. case "Sculpture":
    7. return#imageLiteral(resourceName: "Flagge2.png")
    8. case "Plaque":
    9. return#imageLiteral(resourceName: "Flagge3.png")
    10. case "Mural":
    11. return#imageLiteral(resourceName: "Flagge4.png")
    12. default:
    13. return #imageLiteral(resourceName: "Flagge5.png")
    14. }
    15. }
    Alles anzeigen
    Liebe Grüße,
    Ferdinand
  • Ich weiss, bei Swift-Fragen sollte ich eigentlich meinen Mund halten...

    Wenn ich Dein Problem richtig verstehe, bräuchtest Du doch eigentlich nur eine Extension der UIImage-Klasse, die Dir ein skaliertes Bild zurück liefert, oder? Hierzu gibt es massenhaft Beispiele im Netz, z. B. dieses:

    Quellcode

    1. import Foundation
    2. import UIKit
    3. extension UIImage {
    4. func resizeImageTo(size: CGSize) -> UIImage? {
    5. UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
    6. self.draw(in: CGRect(origin: CGPoint.zero, size: size))
    7. let resizedImage = UIGraphicsGetImageFromCurrentImageContext()!
    8. UIGraphicsEndImageContext()
    9. return resizedImage
    10. }
    11. }
    Alles anzeigen
    Letztlich malst Du das Image einfach angepasst in einen eigenen Context...

    Oder habe ich etwas mißverstanden, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Ich habe das Image ganz normal in meinem Projektordner abgelegt und anschließend per Drag&Drop mit Xcode verknüpft.
    Ich möchte das Bild gerne als Custom Marker auf meiner Karte verwenden.
    Die Funktion zum platzieren eines Markers greift hier auf diese Klasse zurück, um sich das richtige Bild hierfür zu schnappen.

    Quellcode

    1. var image: UIImage {
    2. guard let name = discipline else { return #imageLiteral(resourceName: "Flag") }
    3. switch name {
    4. case "Monument":
    5. return#imageLiteral(resourceName: "Flagge1.png")
    6. case "Sculpture":
    7. return#imageLiteral(resourceName: "Flagge2.png")
    8. case "Plaque":
    9. return#imageLiteral(resourceName: "Flagge3.png")
    10. case "Mural":
    11. return#imageLiteral(resourceName: "Flagge4.png")
    12. default:
    13. return #imageLiteral(resourceName: "Flagge5.png")
    14. }
    15. }
    Alles anzeigen
    Nun habe ich aber das Problem, dass bei der einfachen imageLiteral Methode das Bild in Originalgröße ausgeben wird, also beispielsweise 250x250 Pixel.
    Für die Karte sollte das Bild jedoch eine Größe von 50x50 Pixeln haben.
    Skaliere ich das Bild jetzt mit Photoshop auf diese Größe runter, ist es mega unscharf.
    Deshalb möchte ich dieses Bild direkt in Xcode kleiner skalieren.
    Hierbei habe ich bei Buttons etc. die Erfahrung gemacht dass es trotzdem gestochen scharf wird.

    Gibt es hierfür ne einfache Möglichkeit wie beispielsweise:
    return UiImage(resourceName: "Flagge1.png", height: 250, width: 250)

    Liebe Grüße,
    Ferdinand
  • Ferdinand schrieb:

    Gibt es hierfür ne einfache Möglichkeit wie beispielsweise:
    return UiImage(resourceName: "Flagge1.png", height: 250, width: 250)
    Wie oben gesagt, kannst Du zum Skalieren eine Extension der UIImage-Klasse schreiben ... ob diese auch direkt die Resource laden soll, ist Geschmacksache. Ich würde solche Funktionen immer klein / generisch halten und nach Bedarf kombinieren - zum Laden gibt es ja schon Methoden.

    Wenn Du mit Images hantierst, würde ich Dir die Verwendung des Asset-Katalogs empfehlen: Hier kannst Du die Grafiken in unterschiedlichen Skalierungen vorhalten oder vorzugsweise vektorbasierte PDFs nutzen, die Xcode dann bei Bedarf rastert ("preserve vector data" aktivieren). So kannst Du auch unterschiedliche Grafiken für Dark Mode oder Size Classes nutzen, so wird das Leben m. E. viel einfacher.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Womit stellst du denn das Image dar?

    UIIamgeView unter UIKit oder ImageView in SwiftUI?

    In beiden Fällen ist es nicht unbedingt notwendig das Image klein zu skalieren, um es kleiner als seine PixelSize darzustellen.

    Das was Mattes schreibt ist absolut richtig und löst dein Problem. Doch ich glaube einfach du möchtest ein Image nicht pixelgenau darstellen. 250x250 als 50x50, da musst du nicht das Image für manipulieren.
  • Ferdinand schrieb:

    Ich verstehe leider nur nicht, wie ich das ganze umsetzten soll...
    Weisst Du denn grundsätzlich, was "Extensions" sind bzw. wie man sie verwendet? Falls nicht, wäre das ein sinnvoller Startpunkt zur Recherche.

    Letztlich instanzierst Du dann ein Objekt der Klasse UIImage z. B. mit Lesen aus einer Bundle-Resource und skalierst anschliessend mit dessen (erweiterten) Methode von oben. Heraus kommt wieder ein UIImage, das Du dann oben zurückgeben kannst.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.