Domanda

Ho una UITableViewCell standard in cui sto utilizzando le proprietà di testo e immagini per visualizzare un favicon.ico e un'etichetta. Per la maggior parte, questo funziona davvero bene in quanto UIImage supporta il formato ICO. Tuttavia, alcuni siti (come Amazon.com dire) hanno favicon.icos che fanno uso della capacità del formato ICO di memorizzare più formati nello stesso file. negozi Amazon quattro diverse dimensioni, tutta la strada fino a 48x48.

Questo si traduce in maggior parte delle immagini di essere 16x16 ad eccezione di alcuni che entrare a 32x32 o 48x48 e far sembrare tutto terribile. Ho cercato qui, il forum ufficiale, la documentazione, e altrove, senza successo. Ho provato tutto quello che mi veniva in mente per vincolare le dimensioni dell'immagine. L'unica cosa che ha funzionato è stato un metodo non documentato, che io non sto per usare. Questa è la mia prima app e la mia prima esperienza con cacao (veniva da C #).

Nel caso in cui non sono stato chiaro in quello che sto cercando, idealmente il consiglio centro attorno impostando le dimensioni del UIImage modo che la versione 48x48 sarebbe scalare fino a 16x16 o di un metodo per raccontare UIImage di usare il 16x16 la versione presente nel file ICO. Non necessariamente bisogno di codice:. Solo un suggerimento di un approccio mi avrebbe fatto bene

Qualcuno ha qualche suggerimento? (Ho chiesto nel forum ufficiale così perché ho affondato più di un giorno in questo già. Se una soluzione è inviato lì, mi metterò qui.)

È stato utile?

Soluzione

Ecco cosa l'utente "bcd" oltre ai forum ufficiali postato che ha finito per risolvere il problema (con una leggera modifica da me per renderlo statico per l'inclusione in una serie di metodi di utilità):

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

Altri suggerimenti

che sto facendo qualcosa di simile nella mia 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;
}

Quindi creare una nuova immagine vincolare le proporzioni. Sostituzione "immagine" con l'ICO il file che si ottiene da Amazon.

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

Non ho abbastanza karma ancora commentare le risposte, ma ho avuto un buon successo con il codice bbrandons sopra.

Ho ricevuto un discreto numero di avvisi sulla console anche se per quanto riguarda byte per riga impostazione non essere abbastanza alto - dopo aver letto le risposte a questo pubblicare ho finito per impostandolo a 0, che permette al sistema di determinare il giusto valore.

es:

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

Ecco come ho fatto. Questa tecnica prende cura di spostare le etichette di testo e dettaglio di testo opportunamente a fianco:

@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;
}

Non so nulla su come i file ico lavorare, quindi forse è possibile estrarre comodamente l'immagine 16x16 e l'uso che, ma non ho idea di come fare.

Per quanto io sappia, non è possibile impostare tutte le proprietà utili sulla immagine in una UITableViewCell generico. Il modo più semplice (ancora disordinato, soprattutto se siete nuovi a esso) per scalare tutto giù a 16x16 sarebbe quello di creare una sottoclasse UITableViewCell, dargli un UIImageView, le dimensioni sempre la visualizzazione dell'immagine a 16x16, e impostare il suo contentMode a UIViewContentModeAspectFit.

Ho modificato altrui categoria di persone, al fine di rendere tutte le immagini occupano la stessa larghezza (larghezza visibile), senza ridimensionamento:

-(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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top