web-dev-qa-db-fra.com

UITableViewCell's imageView fit to 40x40

J'utilise les mêmes grandes images dans une tableView et detailView. Besoin de rendre l'imageView remplie en 40x40 quand une image est affichée dans tableView, mais étirée sur la moitié d'un écran. J'ai joué avec plusieurs propriétés mais je n'ai pas de résultat positif:

[cell.imageView setBounds:CGRectMake(0, 0, 50, 50)];
[cell.imageView setClipsToBounds:NO];
[cell.imageView setFrame:CGRectMake(0, 0, 50, 50)];
[cell.imageView setContentMode:UIViewContentModeScaleAspectFill];

J'utilise SDK 3.0 avec build dans "Cell Objects in Predefined Styles".

25
slatvick

J'ai mis le code de Ben en tant qu'extension dans mon fichier NS-Extensions afin que je puisse dire à n'importe quelle image de faire une miniature d'elle-même, comme dans:

UIImage *bigImage = [UIImage imageNamed:@"yourImage.png"];
UIImage *thumb = [bigImage makeThumbnailOfSize:CGSizeMake(50,50)];

Voici le fichier .h:

@interface UIImage (PhoenixMaster)
- (UIImage *) makeThumbnailOfSize:(CGSize)size;
@end

puis dans le fichier NS-Extensions.m:

@implementation UIImage (PhoenixMaster)
- (UIImage *) makeThumbnailOfSize:(CGSize)size
{
    UIGraphicsBeginImageContextWithOptions(size, NO, UIScreen.mainScreen.scale);
    // draw scaled image into thumbnail context
    [self drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();        
    // pop the context
    UIGraphicsEndImageContext();
    if(newThumbnail == nil) 
        NSLog(@"could not scale image");
    return newThumbnail;
}

@end
32
PapaSmurf

Je cache une version miniature car l'utilisation de grandes images réduites à la volée utilise trop de mémoire.

Voici mon code miniature:

- (UIImage *)thumbnailOfSize:(CGSize)size {
    if( self.previewThumbnail )
        return self.previewThumbnail; // returned cached thumbnail

    UIGraphicsBeginImageContext(size);

    // draw scaled image into thumbnail context
    [self.preview drawInRect:CGRectMake(0, 0, size.width, size.height)];

    UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();    

    // pop the context
    UIGraphicsEndImageContext();

    if(newThumbnail == nil) 
        NSLog(@"could not scale image");

    self.previewThumbnail = newThumbnail;

    return self.previewThumbnail;
}

Assurez-vous simplement d'effacer correctement la miniature en cache si vous changez votre image d'origine (self.preview dans mon cas).

12
Ben Lachman

J'ai le mien enveloppé dans une UIView et j'utilise ce code:

imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight;
[self addSubview:imageView];
imageView.frame = self.bounds;

(self est le wrapper UIView, avec les dimensions que je veux - j'utilise AsyncImageView ).

4
alex_c

Je pensais que la suggestion de Ben Lachman de générer des vignettes à l'avance plutôt qu'à la volée était intelligente, alors j'ai adapté son code afin qu'il puisse gérer un tableau entier et le rendre plus portable (pas de noms de propriété codés en dur).

- (NSArray *)arrayOfThumbnailsOfSize:(CGSize)size fromArray:(NSArray*)original {
    NSMutableArray *temp = [NSMutableArray arrayWithCapacity:[original count]];
    for(UIImage *image in original){
        UIGraphicsBeginImageContext(size);
        [image drawInRect:CGRectMake(0,0,size.width,size.height)];
        UIImage *thumb = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        [temp addObject:thumb];
    }
    return [NSArray arrayWithArray:temp];
}
2
guiller