Bildgröße bei Retina und NonRetina

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

  • Bildgröße bei Retina und NonRetina

    Moin alle zusammen,

    ich verzweifle gerade an den Bilder in einer TableView.

    In meiner Toolbar verwende ich Icon in 2 verschiedenen Auflösungen (icon.png und icon@2x~iphone.png). Das klappt auch super und die Icons sehen gestochen scharf aus.

    Ich habe aber eine TableView, bei der die Daten dynamisch von meinem Server geladen werden, auch die Bilder. Wie stelle ich das dort an, damit die auch knackescharf aussehen?

    LG
    Bernd
    Dateien
    • IMG_2165.png

      (384,37 kB, 332 mal heruntergeladen, zuletzt: )
    Ich bin gegen Signaturen!!!
  • Ja, das ist die große Frage. WIE lade ich die passende Version?

    Das iOS verwendet die Retina-Version des Bildes automatisch, wenn Sie den gleichen
    Dateinamen mit dem Zusatz @2x vor der Dateiendung verwenden. Heißt beispielsweise das Bild für die Standardauflösung
    Bild.png, dann ist der Name für die hohe Auflösung Bild@2x.png. Das gilt für alle Bilder, die Sie über den Interface Builder einem UI-Element zuweisen
    oder die Sie mit dem Convenience-Konstruktor imageNamed: der Klasse UIImage laden. Sie müssen aber keine Retina-Version bereitstellen. In diesem Fall skaliert
    Cocoa Touch einfach die normalen Bilder auf die hohe Auflösung.


    Die Bilder lade ich über das SDWebImage-Framework

    Quellcode

    1. [imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ios.hocas.de/%@",[kategorie_dic objectForKey:@"bild"]]] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    Ich bin gegen Signaturen!!!
  • der dateiname spielt ja nur eine rolle bei imageNamed, jedoch nicht bei initByReferencingFile (ich gehe davon aus dass SDWebImage zweiteres verwendet, ersteres funktioniert ja nur mit dateien im bundle).

    du musst dem server natürlich sagen ob er das retina oder non-retina bild ausliefern soll.
  • Ich habe das jetzt so gemacht:

    Quellcode

    1. if ([[UIScreen mainScreen] scale] < 2) {
    2. [imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ios.hocas.de/%@",[kategorie_dic objectForKey:@"normal"]]] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    3. } else {
    4. [imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ios.hocas.de/%@",[kategorie_dic objectForKey:@"retina"]]] placeholderImage:[UIImage imageNamed:@"placeholder2.png"]];
    5. }
    Ich bin gegen Signaturen!!!
  • beage schrieb:

    Ich habe das jetzt so gemacht:

    Quellcode

    1. if ([[UIScreen mainScreen] scale] < 2) {
    2. [imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ios.hocas.de/%@",[kategorie_dic objectForKey:@"normal"]]] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    3. } else {
    4. [imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ios.hocas.de/%@",[kategorie_dic objectForKey:@"retina"]]] placeholderImage:[UIImage imageNamed:@"placeholder2.png"]];
    5. }


    warum so kompliziert? so musst du in jedem dict 2 namen vorhalten. ich würde das einfach über einen prefix machen.
    also in etwa so:

    Quellcode

    1. ​@"http://ios.hocas.de/2x_%@"
  • gritsch schrieb:

    beage schrieb:

    Ich habe das jetzt so gemacht:

    Quellcode

    1. if ([[UIScreen mainScreen] scale] < 2) {
    2. [imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ios.hocas.de/%@",[kategorie_dic objectForKey:@"normal"]]] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    3. } else {
    4. [imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ios.hocas.de/%@",[kategorie_dic objectForKey:@"retina"]]] placeholderImage:[UIImage imageNamed:@"placeholder2.png"]];
    5. }


    warum so kompliziert? so musst du in jedem dict 2 namen vorhalten. ich würde das einfach über einen prefix machen.
    also in etwa so:

    Quellcode

    1. ​@"http://ios.hocas.de/2x_%@"


    Das Dict hab ich doch sowieso, weil dort die ganzen Daten drin stehen. Auf die eine Spalte kommt es auch nicht mehr an ;)
    Ich bin gegen Signaturen!!!
  • beage schrieb:

    gritsch schrieb:

    beage schrieb:

    Ich habe das jetzt so gemacht:

    Quellcode

    1. if ([[UIScreen mainScreen] scale] < 2) {
    2. [imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ios.hocas.de/%@",[kategorie_dic objectForKey:@"normal"]]] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    3. } else {
    4. [imageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://ios.hocas.de/%@",[kategorie_dic objectForKey:@"retina"]]] placeholderImage:[UIImage imageNamed:@"placeholder2.png"]];
    5. }


    warum so kompliziert? so musst du in jedem dict 2 namen vorhalten. ich würde das einfach über einen prefix machen.
    also in etwa so:

    Quellcode

    1. ​@"http://ios.hocas.de/2x_%@"


    Das Dict hab ich doch sowieso, weil dort die ganzen Daten drin stehen. Auf die eine Spalte kommt es auch nicht mehr an ;)


    wenn es sich um viele bilder/dicts handelt dann geht das aber an den speicher (von dem wir ja nicht so massig haben auf iOS)!
  • macmoonshine schrieb:

    gritsch schrieb:

    die paar byte? bei bildern?

    Wenn ich mir die Bilder auf Beages Screenshot ansehe, geht es hier ja nicht um Fotos, sondern um Icons. Abgesehen davon müssen alle Retina-Geräte auch die großen Bilder laden, und Non-Retina stirbt ja langsam aber sicher aus.


    trotzdem lädst du die 4-fache anzahl an bytes aus dem netz und in den speicher des geräts (und von letzerem haben vor allem die non-retina geräte nicht wirklich viel).
  • gritsch schrieb:

    macmoonshine schrieb:

    Warum lädst nicht immer die Retina-Auflösung? Bei Non-Retina skaliert der Imageview das Bild doch sowieso auf die richtige Größe; und die paar Byte mehr. ;)


    beage schrieb:

    Mhm, wenn man es so sieht, stimmt


    die paar byte? bei bildern?


    Ja, es sind wirklich nur ein paar Byte. Die Dinger sind (siehe Screenshot) 120x120px groß mit ca. 1000 Byte in der Retinaauflösung und nur einfarbig. Die 60x60px-Variante ist ca. 700 Byte groß. Ich denke, das kann man vernachlässigen
    Ich bin gegen Signaturen!!!
  • entwickler schrieb:

    ich würde für soetwas paintcode verwenden.
    Kleinste Größe, maximales Ergebnis.


    Meinst Du, was iDraw als "Kerngrafikcode" ausspuckt?

    Quellcode

    1. #if TARGET_OS_IPHONE
    2. CGContextRef ctx = UIGraphicsGetCurrentContext(); // iOS
    3. #else
    4. CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort]; // OS X
    5. #endif
    6. // enable the following lines for flipped coordinate systems in OS X views
    7. //CGContextTranslateCTM(ctx, 0, self.bounds.size.height);
    8. //CGContextScaleCTM(ctx, 1, -1);
    9. /* Shape */
    10. CGMutablePathRef pathRef = CGPathCreateMutable();
    11. CGPathMoveToPoint(pathRef, NULL, 43.158, 32.164);
    12. ......
    Alles anzeigen


    Den Code kann ich von dem Minibildchen hier gar nicht posten, weil er über 10.000 Zeichen lang ist
    Ich bin gegen Signaturen!!!