Question

J'ai un UITableViewCell standard où j'utilise les propriétés du texte et de l'image pour afficher une favicon.ico et une étiquette. Pour la plupart, cela fonctionne très bien depuis UIImage supporte le format ICO. Cependant, certains sites (comme Amazon.com dire) ont favicon.icos qui font usage de la capacité du format ICO pour stocker plusieurs tailles dans le même fichier. Amazon stocke quatre tailles différentes, tout le chemin jusqu'à 48x48.

Il en résulte la plupart des images étant 16x16, sauf pour quelques-uns qui viennent dans à 48x48 ou 32x32 et tout faire paraître terribles. J'ai cherché ici, le forum officiel, la documentation, et d'ailleurs sans succès. J'ai tout essayé que je pouvais penser à limiter la taille de l'image. La seule chose qui a fonctionné était une méthode non documentée, que je ne suis pas sur le point d'utiliser. Ceci est ma première application et ma première expérience avec Cocoa (venu de C #).

Dans le cas où je ne suis pas clair dans ce que je cherche, idéalement les conseils se concentrerait autour définissant les dimensions du UIImage afin que la version 48x48 escaladeraient jusqu'à 16x16 ou une méthode pour dire UIImage d'utiliser le 16x16 version actuelle dans le fichier ICO. Je ne suis pas nécessairement besoin d'un code:. Une suggestion d'une approche me ferait bien

Quelqu'un at-il des suggestions? (J'ai demandé dans le forum officiel ainsi parce que j'ai sombré plus d'un jour en déjà. Si une solution est là affichée, je vais le mettre ici.)

Était-ce utile?

La solution

Voici ce que l'utilisateur « bcd » sur les forums officiels posté qui ont fini par résoudre le problème (avec une légère modification par moi-même pour le rendre statique à inclure dans un ensemble de méthodes utilitaires):

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

Autres conseils

Je fais quelque chose de similaire dans mon application.

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

Ensuite, créez une nouvelle image limitant les proportions. Remplacement "image" avec le fichier ICO vous d'Amazon.

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

Ne pas avoir encore assez de karma pour commenter les réponses, mais j'eu un bon succès avec le code bbrandons ci-dessus.

J'ai eu un assez grand nombre d'avertissements sur la console mais en ce qui concerne les octets par rangée réglage ne pas être suffisamment élevé - après avoir lu les réponses à cette poster j'ai fini par le mettre à 0, ce qui permet au système de déterminer la juste valeur.

par exemple:

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

Voilà comment je l'ai fait. Cette technique prend soin de déplacer les étiquettes de texte et le texte en détail de façon appropriée à gauche:

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

Je ne sais pas quoi que ce soit sur la façon dont les fichiers ico travail, alors peut-être il est possible d'extraire haut la main l'image de 16x16 et l'utiliser, mais je ne sais pas comment.

Pour autant que je sache, il est impossible de définir des propriétés utiles sur l'image dans un UITableViewCell générique. La façon la plus simple (toujours en désordre, surtout si vous êtes nouveau pour elle) à l'échelle de tout jusqu'à 16x16 serait de sous-classe UITableViewCell, lui donner un UIImageView, la taille toujours la vue de l'image à 16x16, et définir sa contentMode à UIViewContentModeAspectFit.

Je l'ai modifié la catégorie des gens d'autres, afin de rendre toutes les images occupent la même largeur (largeur visible), SANS ECHELLE:

-(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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top