Frage

Ich habe einen Standard UITableViewCell, wo ich die Text- und Bildeigenschaften bin mit einem favicon.ico und einem Label angezeigt werden soll. In den meisten Fällen funktioniert dies sehr gut, da UIImage das ICO-Format unterstützt. Allerdings sind einige Websites (wie Amazon.com sagen) haben favicon.icos dass die Verwendung des ICO-Format Fähigkeit machen mehr Größen in der gleichen Datei zu speichern. Amazon speichert vier verschiedenen Größen, den ganzen Weg bis zu 48x48.

Dies führt in den meisten Bilder 16x16 bis auf wenige Ausnahmen, die kommen in bei 32x32 oder 48x48 und machen alles sehen schrecklich sein. Ich habe hier gesucht, das offizielle Forum, die Dokumentation und anderswo ohne Erfolg. Ich habe alles versucht, das ich von begrenzen die Bildgröße denken konnte. Das einzige, was arbeitete, war ein nicht dokumentiertes Verfahren, das ich nicht bin zu verwenden. Dies ist mein erster App und meine erste Erfahrung mit Cocoa (kam von C #).

Falls ich nicht klar war, was ich suche, im Idealfall würde der Rat die Abmessungen der UIImage Einstellzentrum um, so dass die 48x48-Version 16x16 oder ein Verfahren verringern würde UIImage zu sagen, die 16x16 zu verwenden Version in der ICO-Datei. Ich bin nicht unbedingt Code benötigen. Nur ein Vorschlag eines Ansatzes würde mir gut tun

Hat jemand irgendwelche Vorschläge? (Bat ich im offiziellen Forum auch weil ich versenkt habe mehr als einen Tag in dies bereits. Wenn eine Lösung dort gebucht wird, werde ich es auch hier setzen).

War es hilfreich?

Lösung

Hier ist, was User „bcd“ über in den offiziellen Foren geschrieben die Lösung am Ende das Problem (mit einer geringfügigen Änderung von mir es für die Aufnahme in eine Reihe von Hilfsmethoden statisch zu machen):

+ (UIImage *)scale:(UIImage *)image toSize:(CGSize)size
{
    UIGraphicsBeginImageContext(size);
    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return scaledImage;
}

Andere Tipps

Ich tue etwas Ähnliches in meiner app.

    UIImage* resizedImage(UIImage *inImage, CGRect thumbRect)
{
    CGImageRef          imageRef = [inImage CGImage];
    CGImageAlphaInfo    alphaInfo = CGImageGetAlphaInfo(imageRef);

    if (alphaInfo == kCGImageAlphaNone)
        alphaInfo = kCGImageAlphaNoneSkipLast;

    CGContextRef bitmap = CGBitmapContextCreate (NULL, thumbRect.size.width, thumbRect.size.height, 8, thumbRect.size.width*3, 
                                                                                 CGColorSpaceCreateDeviceRGB(), alphaInfo);

    CGContextDrawImage(bitmap, thumbRect, imageRef);

    CGImageRef  ref = CGBitmapContextCreateImage(bitmap);
    UIImage*    result = [UIImage imageWithCGImage:ref];

    CGContextRelease(bitmap);
    CGImageRelease(ref);

    return result;
}

Erstellen Sie dann ein neues Bild die Proportionen einschränken. Ersetzen von „Bild“ mit dem ICO Datei, die Sie von Amazon bekommen.

CGRect sz = CGRectMake(0.0f, 0.0f, 16, 16);
UIImage *resized = resizedImage(image, sz);

Sie genug Karma noch nicht auf Antworten kommentieren, aber ich hatte gute Erfolge mit bbrandons Code oben.

Ich habe eine ganze Reihe von Warnungen auf der Konsole allerdings in Bezug auf Byte pro Zeile Einstellung nicht hoch genug ist - nach Antworten auf diese Post ich landete es auf 0 setzen, die das System den richtigen Wert bestimmen können.

Beispiel:

CGContextRef bitmap = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, CGColorSpaceCreateDeviceRGB(), alphaInfo);

Hier ist, wie ich es tat. Diese Technik sorgt für die Text- und detailliert beschriftet entsprechend nach links verschieben:

@interface SizableImageCell : UITableViewCell {}
@end
@implementation SizableImageCell
- (void)layoutSubviews {
    [super layoutSubviews];

    float desiredWidth = 80;
    float w=self.imageView.frame.size.width;
    if (w>desiredWidth) {
        float widthSub = w - desiredWidth;
        self.imageView.frame = CGRectMake(self.imageView.frame.origin.x,self.imageView.frame.origin.y,desiredWidth,self.imageView.frame.size.height);
        self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x-widthSub,self.textLabel.frame.origin.y,self.textLabel.frame.size.width+widthSub,self.textLabel.frame.size.height);
        self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x-widthSub,self.detailTextLabel.frame.origin.y,self.detailTextLabel.frame.size.width+widthSub,self.detailTextLabel.frame.size.height);
        self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    }
}
@end

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[SizableImageCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    cell.textLabel.text = ...
    cell.detailTextLabel.text = ...
    cell.imageView.image = ...
    return cell;
}

Ich weiß nichts darüber, wie ICO-Dateien arbeiten, so dass vielleicht möglich, es ist handlich 16x16 Bild zu extrahieren und verwenden, aber ich habe keine Ahnung, wie.

Soweit mir bekannt ist, ist es nicht möglich, alle nützlichen Eigenschaften auf das Bild in einem allgemeinen UITableViewCell einzustellen. Die einfachste Art und Weise (noch chaotisch, vor allem, wenn Sie es neu sind) alles maßstab bis 16x16 UITableViewCell Unterklasse wäre, gibt ihm ein UIImageView, Größe immer die Bildansicht auf 16x16, und legen Sie seine contentMode UIViewContentModeAspectFit.

Ich habe andere Menschen Kategorie, modifiziert, um alle Bilder zu machen, die gleiche Breite (sichtbare Breite) besetzen, ohne Skalierung:

-(UIImage*) centerImage:(UIImage *)inImage inRect:(CGRect) thumbRect
{

    CGSize size= thumbRect.size;
    UIGraphicsBeginImageContext(size);  
    //calculation
    [inImage drawInRect:CGRectMake((size.width-inImage.size.width)/2, (size.height-inImage.size.height)/2, inImage.size.width, inImage.size.height)];
    UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();        
    // pop the context
    UIGraphicsEndImageContext();
    return newThumbnail;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top