111 votes

Comment faire pour que l'ImageView de UITableViewCell ait une taille fixe même si l'image est plus petite ?

J'ai un groupe d'images que j'utilise pour les vues d'images des cellules, elles ne sont pas toutes plus grandes que 50x50. Par exemple, 40x50, 50x32, 20x37 ......

Lorsque je charge la vue tableau, le texte n'est pas aligné car la largeur des images varie. J'aimerais également que les petites images apparaissent au centre plutôt qu'à gauche.

Voici le code que j'essaie d'utiliser dans ma méthode 'cellForRowAtIndexPath'.

cell.imageView.autoresizingMask = ( UIViewAutoresizingNone );
cell.imageView.autoresizesSubviews = NO;
cell.imageView.contentMode = UIViewContentModeCenter;
cell.imageView.bounds = CGRectMake(0, 0, 50, 50);
cell.imageView.frame = CGRectMake(0, 0, 50, 50);
cell.imageView.image = [UIImage imageWithData: imageData];

Comme vous pouvez le constater, j'ai essayé plusieurs choses, mais aucune ne fonctionne.

158voto

Nils Munch Points 4574

Il n'est pas nécessaire de tout réécrire. Je recommande plutôt de faire ceci :

Placez ceci dans votre fichier .m de votre cellule personnalisée.

- (void)layoutSubviews {
    [super layoutSubviews];
    self.imageView.frame = CGRectMake(0,0,32,32);
}

Cela devrait faire l'affaire. :]

31 votes

Si vous définissez self.imageView.bounds l'image sera centrée.

0 votes

True :] Une fois que vous êtes dans LayoutSubview vous pouvez faire tout ce que vous feriez normalement en créant vos propres UIImageViews. Rappelez-vous juste, comme toujours, de ne pas avoir de codes trop lourds là-dedans, et de garder les calculs au minimum.

47 votes

Et si nous n'ajoutons pas une sous-classe de UITableViewCell ?

144voto

Pour ceux d'entre vous qui n'ont pas de sous-classe de UITableViewCell :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 [...]

      CGSize itemSize = CGSizeMake(40, 40);
      UIGraphicsBeginImageContextWithOptions(itemSize, NO, UIScreen.mainScreen.scale);
      CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
      [cell.imageView.image drawInRect:imageRect];
      cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();

 [...]
     return cell;
}

Le code ci-dessus définit la taille de 40x40.

Swift 2

    let itemSize = CGSizeMake(25, 25);
    UIGraphicsBeginImageContextWithOptions(itemSize, false, UIScreen.mainScreen().scale);
    let imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
    cell.imageView?.image!.drawInRect(imageRect)
    cell.imageView?.image! = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

Ou vous pouvez utiliser une autre approche (non testée) suggérée par @Tommy :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 [...]

      CGSize itemSize = CGSizeMake(40, 40);
      UIGraphicsBeginImageContextWithOptions(itemSize, NO, 0.0)          
 [...]
     return cell;
}

Swift 3+

let itemSize = CGSize.init(width: 25, height: 25)
UIGraphicsBeginImageContextWithOptions(itemSize, false, UIScreen.main.scale);
let imageRect = CGRect.init(origin: CGPoint.zero, size: itemSize)
cell?.imageView?.image!.draw(in: imageRect)
cell?.imageView?.image! = UIGraphicsGetImageFromCurrentImageContext()!;
UIGraphicsEndImageContext();

Le code ci-dessus est la version Swift 3+ de ce qui précède.

3 votes

La distorsion de l'image peut être corrigée par UIGraphicsBeginImageContextWithOptions(itemSize, NO, UIScreen.mainScreen.scale) ; au lieu de UIGraphicsBeginImageContext(itemSize) ;

1 votes

Bonne réponse. BTW, je n'ai pas eu l'option de UIScreen.mainScreen.scale alors j'ai choisi UIGraphicsBeginImageContext . J'ai également redimensionné l'imageView dans la cellule de base.

3 votes

@GermanAttanasioRuiz sur la sélection de la cellule, il redimensionne à nouveau à l'original, est-il censé être de cette façon, comment résoudre cela.

33voto

Chris Points 13472

Voici comment je l'ai fait. Cette technique permet de déplacer le texte et les étiquettes de détail vers la 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;
}

0 votes

Merci, Chris. Cela a parfaitement fonctionné. Vous devriez peut-être le mettre à jour en supprimant l'autorelease car l'ARC l'interdit maintenant. Mais la réponse est excellente !

1 votes

C'est encore aujourd'hui la meilleure solution. Merci.

0 votes

De nos jours, je recommanderais probablement de créer une cellule personnalisée avec un xib ou un prototyp. [ ]

22voto

Rinju Jain Points 1115

Ajout d'une vue d'image comme sous-vue de la cellule de la vue de table

UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(20, 5, 90, 70)];
imgView.backgroundColor=[UIColor clearColor];
[imgView.layer setCornerRadius:8.0f];
[imgView.layer setMasksToBounds:YES];
[imgView setImage:[UIImage imageWithData: imageData]];
[cell.contentView addSubview:imgView];

1 votes

N'oubliez pas de libérer imgView si vous n'utilisez pas ARC.

15voto

Peter Robert Points 268

La cellule entière n'a pas besoin d'être refaite. Vous pouvez utiliser les propriétés indentationLevel et indentationWidth de tableViewCells pour décaler le contenu de votre cellule. Ensuite, vous ajoutez votre imageView personnalisée sur le côté gauche de la cellule.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X