Comment rendre ImageView de UITableViewCell une taille fixe même lorsque l'image est plus petite

104

J'ai un tas d'images que j'utilise pour les vues d'image de la cellule, elles ne sont toutes pas plus grandes que 50x50. par exemple 40x50, 50x32, 20x37 .....

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

Voici le code que j'essaye 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 voir, j'ai essayé plusieurs choses, mais aucune ne fonctionne.

Robert
la source

Réponses:

152

Il n'est pas nécessaire de tout réécrire. Je recommande de faire ceci à la place:

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

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

Cela devrait bien faire l'affaire. :]

Nils Munch
la source
28
si vous définissez self.imageView.boundsl'image sera centrée.
BLeB
45
et si nous n'ajoutons pas de sous-classe de UITableViewCell?
nonopolarité
3
@ 動靜 能量: Sous-classer UITableViewCell est la principale astuce pour que cela fonctionne.
auco
5
Cela ne fonctionne pas pour moi. L'image englobe toujours la totalité de l'imageView.
joslinm
14
Cela ne fonctionne pas non plus pour moi car les étiquettes sont mal alignées.
nverinaud
139

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 sur 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.

Allemand Attanasio
la source
3
La distorsion de l'image peut être corrigée par UIGraphicsBeginImageContextWithOptions (itemSize, NO, UIScreen.mainScreen.scale); au lieu de UIGraphicsBeginImageContext (itemSize);
Kiran Ruth R
1
Bonne réponse. BTW, je n'ai pas eu le choix, UIScreen.mainScreen.scalealors je suis juste allé avec UIGraphicsBeginImageContext. Redimensionnement également de l'imageView dans la cellule de base.
denikov
3
@GermanAttanasioRuiz en sélectionnant la cellule, il redimensionne à nouveau à l'original, est-il censé être de cette façon, comment résoudre cela.
Bonnie
6
pour tous ceux qui ont été confus comme moi, vous devez définir l'image avant le début du contexte. ie cell.imageView.image = [UIImage imageNamed: @ "my_image.png"];
Guy Lowe
5
Une opération aussi coûteuse ne devrait pas faire partie de cellForRowAtIndexPath
Krizai
33

Voici comment je l'ai fait. Cette technique prend soin de déplacer le texte et les étiquettes de texte de détail de manière appropriée 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;
}
Chris
la source
Merci, Chris. Cela a parfaitement fonctionné. Vous voudrez peut-être le mettre à jour en supprimant la libération automatique car ARC l'interdit maintenant. Excellente réponse cependant!
CSawy
1
C'est toujours la meilleure solution aujourd'hui. Je vous remercie.
Rémi Belzanti
Ces jours-ci, je recommanderais probablement de créer une cellule personnalisée avec un xib ou une cellule prototype dans un storyboard, et de créer une toute autre vue d'image sans rapport avec la vue d'image d'une cellule standard. Mais c'est encore assez simple, je suppose!
Chris
1
Je veux tout faire avec du code au lieu d'utiliser un xib ou un storyboard et cela a parfaitement fonctionné.
John81
Cette réponse ne fait rien si w <desireWith, ce qui me semble être le cas d'utilisation intéressant (du moins dans la question).
Nate
21

vue d'image ajouter comme vue secondaire à la cellule de vue de tableau

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];
Rinju Jain
la source
1
N'oubliez pas de libérer imgView si vous n'utilisez pas ARC.
Charlie Monroe
14

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éplacer le contenu de votre cellule. Ensuite, vous ajoutez votre imageView personnalisée sur le côté gauche de la cellule.

Peter Robert
la source
6

Mieux vaut créer une vue d'image et l'ajouter en tant que vue secondaire à la cellule.Ensuite, vous pouvez obtenir la taille d'image souhaitée.

guerrier
la source
Je viens d'essayer cela, cela semble bon début, mais le texte dans les cellules chevauche maintenant les images, comment déplacer la vue du contenu de 50 pixels vers la droite? cell.contentView.bounds = CGRectMake (50, 0, 270, 50); n'a aucun effet
Robert
1
Au lieu d'utiliser la vue par défaut de la cellule, créez une étiquette et ajoutez-la en tant que vue secondaire à la cellule, puis affectez le texte à la propriété de texte d'étiquette. Par cela, vous pouvez concevoir la cellule selon vos besoins.
Warrior
Ce sera plus utile si vous souhaitez afficher le titre, la date, la description, etc., plus de valeurs dans une cellule.
Warrior
Ok, donc je dois refaire la cellule par programmation. Ça ne devrait pas être trop dur. Merci pour l'aide.
Robert
6

Un Simply Swift ,

Étape 1: créer une sous-classe de l' UITableViewCell
étape 2: ajouter cette méthode à la sous-classe de UITableViewCell

override func layoutSubviews() {
    super.layoutSubviews()
    self.imageView?.frame = CGRectMake(0, 0, 10, 10)
}

Étape 3: Créez un objet de cellule à l'aide de cette sous-classe dans cellForRowAtIndexPath,

Ex: let customCell:CustomCell = CustomCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")

Étape 4: Profitez

Mohammad Zaid Pathan
la source
2
UIImage *image = cell.imageView.image;

UIGraphicsBeginImageContext(CGSizeMake(35,35));
// draw scaled image into thumbnail context

[image drawInRect:CGRectMake(5, 5, 35, 35)]; //
UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();
// pop the context
UIGraphicsEndImageContext();
if(newThumbnail == nil)
{
    NSLog(@"could not scale image");
    cell.imageView.image = image;
}
else
{
    cell.imageView.image = newThumbnail;
}
Mohit Gaur
la source
2

Cela a fonctionné pour moi rapidement:

Créez une sous-classe de UITableViewCell (assurez-vous de lier votre cellule dans le storyboard)

class MyTableCell:UITableViewCell{
    override func layoutSubviews() {
        super.layoutSubviews()

        if(self.imageView?.image != nil){

            let cellFrame = self.frame
            let textLabelFrame = self.textLabel?.frame
            let detailTextLabelFrame = self.detailTextLabel?.frame
            let imageViewFrame = self.imageView?.frame

            self.imageView?.contentMode = .ScaleAspectFill
            self.imageView?.clipsToBounds = true
            self.imageView?.frame = CGRectMake((imageViewFrame?.origin.x)!,(imageViewFrame?.origin.y)! + 1,40,40)
            self.textLabel!.frame = CGRectMake(50 + (imageViewFrame?.origin.x)! , (textLabelFrame?.origin.y)!, cellFrame.width-(70 + (imageViewFrame?.origin.x)!), textLabelFrame!.height)
            self.detailTextLabel!.frame = CGRectMake(50 + (imageViewFrame?.origin.x)!, (detailTextLabelFrame?.origin.y)!, cellFrame.width-(70 + (imageViewFrame?.origin.x)!), detailTextLabelFrame!.height)
        }
    }
}

Dans cellForRowAtIndexPath, retirez la cellule de la file d'attente en tant que nouveau type de cellule:

    let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! MyTableCell

Modifiez évidemment les valeurs numériques en fonction de votre mise en page

Derek
la source
1

J'ai créé une extension en utilisant la réponse de @GermanAttanasio. Il fournit une méthode pour redimensionner une image à la taille souhaitée et une autre méthode pour faire de même tout en ajoutant une marge transparente à l'image (cela peut être utile pour les vues de tableau où vous souhaitez que l'image ait également une marge).

import UIKit

extension UIImage {

    /// Resizes an image to the specified size.
    ///
    /// - Parameters:
    ///     - size: the size we desire to resize the image to.
    ///
    /// - Returns: the resized image.
    ///
    func imageWithSize(size: CGSize) -> UIImage {

        UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.mainScreen().scale);
        let rect = CGRectMake(0.0, 0.0, size.width, size.height);
        drawInRect(rect)

        let resultingImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return resultingImage
    }

    /// Resizes an image to the specified size and adds an extra transparent margin at all sides of
    /// the image.
    ///
    /// - Parameters:
    ///     - size: the size we desire to resize the image to.
    ///     - extraMargin: the extra transparent margin to add to all sides of the image.
    ///
    /// - Returns: the resized image.  The extra margin is added to the input image size.  So that
    ///         the final image's size will be equal to:
    ///         `CGSize(width: size.width + extraMargin * 2, height: size.height + extraMargin * 2)`
    ///
    func imageWithSize(size: CGSize, extraMargin: CGFloat) -> UIImage {

        let imageSize = CGSize(width: size.width + extraMargin * 2, height: size.height + extraMargin * 2)

        UIGraphicsBeginImageContextWithOptions(imageSize, false, UIScreen.mainScreen().scale);
        let drawingRect = CGRect(x: extraMargin, y: extraMargin, width: size.width, height: size.height)
        drawInRect(drawingRect)

        let resultingImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return resultingImage
    }
}
diegoreymendez
la source
1

Voici la méthode de travail de @germanattanasio, écrite pour Swift 3

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    cell.imageView?.image = myImage
    let itemSize = CGSize(width:42.0, height:42.0)
    UIGraphicsBeginImageContextWithOptions(itemSize, false, 0.0)
    let imageRect = CGRect(x:0.0, y:0.0, width:itemSize.width, height:itemSize.height)
    cell.imageView?.image!.draw(in:imageRect)
    cell.imageView?.image! = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
}
FrédéricP
la source
1

Si vous utilisez, cell.imageView?.translatesAutoresizingMaskIntoConstraints = falsevous pouvez définir des contraintes sur l'imageView. Voici un exemple de travail que j'ai utilisé dans un projet. J'ai évité les sous-classes et je n'ai pas eu besoin de créer un storyboard avec des cellules prototypes, mais j'ai mis un certain temps à démarrer, il est donc préférable de ne l'utiliser que s'il n'y a pas de moyen plus simple ou plus concis à votre disposition.

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 80
}



    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .subtitle, reuseIdentifier: String(describing: ChangesRequiringApprovalTableViewController.self))

    let record = records[indexPath.row]

    cell.textLabel?.text = "Title text"

    if let thumb = record["thumbnail"] as? CKAsset, let image = UIImage(contentsOfFile: thumb.fileURL.path) {
        cell.imageView?.contentMode = .scaleAspectFill
        cell.imageView?.image = image
        cell.imageView?.translatesAutoresizingMaskIntoConstraints = false
        cell.imageView?.leadingAnchor.constraint(equalTo: cell.contentView.leadingAnchor).isActive = true
        cell.imageView?.widthAnchor.constraint(equalToConstant: 80).rowHeight).isActive = true
        cell.imageView?.heightAnchor.constraint(equalToConstant: 80).isActive = true
        if let textLabel = cell.textLabel {
            let margins = cell.contentView.layoutMarginsGuide
            textLabel.translatesAutoresizingMaskIntoConstraints = false
            cell.imageView?.trailingAnchor.constraint(equalTo: textLabel.leadingAnchor, constant: -8).isActive = true
            textLabel.topAnchor.constraint(equalTo: margins.topAnchor).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: margins.trailingAnchor).isActive = true
            let bottomConstraint = textLabel.bottomAnchor.constraint(equalTo: margins.bottomAnchor)
            bottomConstraint.priority = UILayoutPriorityDefaultHigh
            bottomConstraint.isActive = true
            if let description = cell.detailTextLabel {
                description.translatesAutoresizingMaskIntoConstraints = false
                description.bottomAnchor.constraint(equalTo: margins.bottomAnchor).isActive = true
                description.trailingAnchor.constraint(equalTo: margins.trailingAnchor).isActive = true
                cell.imageView?.trailingAnchor.constraint(equalTo: description.leadingAnchor, constant: -8).isActive = true
                textLabel.bottomAnchor.constraint(equalTo: description.topAnchor).isActive = true
            }
        }
        cell.imageView?.clipsToBounds = true
    }

    cell.detailTextLabel?.text = "Detail Text"

    return cell
}
robwithhair
la source
0

Le UITableViewCell standard fonctionne bien pour positionner les choses mais le cell.imageView ne semble pas se comporter comme vous le souhaitez. J'ai trouvé qu'il était assez simple de faire en sorte que UITableViewCell se présente correctement en donnant d'abord la cellule.

// Putting in a blank image to make sure text always pushed to the side.
UIGraphicsBeginImageContextWithOptions(CGSizeMake(kGroupImageDimension, kGroupImageDimension), NO, 0.0);
UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
cell.imageView.image = blank;

Ensuite, vous pouvez simplement connecter votre propre UIImageView fonctionnant correctement avec

// The cell.imageView increases in size to accomodate the image given it.
// We don't want this behaviour so we just attached a view on top of cell.imageView.
// This gives us the positioning of the cell.imageView without the sizing
// behaviour.
UIImageView *anImageView = nil;
NSArray *subviews = [cell.imageView subviews];
if ([subviews count] == 0)
{
    anImageView = [[UIImageView alloc] init];
    anImageView.translatesAutoresizingMaskIntoConstraints = NO;
    [cell.imageView addSubview:anImageView];

    NSLayoutConstraint *aConstraint = [NSLayoutConstraint constraintWithItem:anImageView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:cell.imageView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0];
    [cell.imageView addConstraint:aConstraint];

    aConstraint = [NSLayoutConstraint constraintWithItem:anImageView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:cell.imageView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0];
    [cell.imageView addConstraint:aConstraint];

    aConstraint = [NSLayoutConstraint constraintWithItem:anImageView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:kGroupImageDimension];
    [cell.imageView addConstraint:aConstraint];

    aConstraint = [NSLayoutConstraint constraintWithItem:anImageView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:kGroupImageDimension];
    [cell.imageView addConstraint:aConstraint];
}
else
{
    anImageView = [subviews firstObject];
}

Définissez l'image sur anImageView et il fera ce que vous attendez d'un UIImageView. Soyez la taille que vous voulez quelle que soit l'image que vous lui donnez. Cela devrait aller dans tableView: cellForRowAtIndexPath:

Gérard
la source
0

Cette solution dessine essentiellement l'image comme «ajustement d'aspect» dans le rect donné.

CGSize itemSize = CGSizeMake(80, 80);
UIGraphicsBeginImageContextWithOptions(itemSize, NO, UIScreen.mainScreen.scale);
UIImage *image = cell.imageView.image;

CGRect imageRect;
if(image.size.height > image.size.width) {
    CGFloat width = itemSize.height * image.size.width / image.size.height;
    imageRect = CGRectMake((itemSize.width - width) / 2, 0, width, itemSize.height);
} else {
    CGFloat height = itemSize.width * image.size.height / image.size.width;
    imageRect = CGRectMake(0, (itemSize.height - height) / 2, itemSize.width, height);
}

[cell.imageView.image drawInRect:imageRect];
cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
pseudo
la source
0

J'ai eu le même problème. Merci à tous ceux qui ont répondu - j'ai pu trouver une solution en utilisant des parties de plusieurs de ces réponses.

Ma solution utilise Swift 5

Le problème que nous essayons de résoudre est que nous pouvons avoir des images avec des proportions différentes dans nos TableViewCells mais nous voulons qu'elles soient rendues avec des largeurs cohérentes. Les images doivent, bien sûr, être rendues sans distorsion et remplir tout l'espace. Dans mon cas, je me débrouillais bien avec certains "recadrages" d'images hautes et maigres, j'ai donc utilisé le mode contenu.scaleAspectFill

Pour ce faire, j'ai créé une sous-classe personnalisée de UITableViewCell. Dans mon cas, je l'ai nommé StoryTableViewCell. La classe entière est collée ci-dessous, avec des commentaires en ligne.

Cette approche a fonctionné pour moi lorsque j'utilise également une vue accessoire personnalisée et de longues étiquettes de texte. Voici une image du résultat final:

Vue de tableau rendue avec une largeur d'image constante

class StoryTableViewCell: UITableViewCell {

    override func layoutSubviews() {
        super.layoutSubviews()

        // ==== Step 1 ====
        // ensure we have an image
        guard let imageView = self.imageView else {return}

        // create a variable for the desired image width
        let desiredWidth:CGFloat = 70;

        // get the width of the image currently rendered in the cell
        let currentImageWidth = imageView.frame.size.width;

        // grab the width of the entire cell's contents, to be used later
        let contentWidth = self.contentView.bounds.width

        // ==== Step 2 ====
        // only update the image's width if the current image width isn't what we want it to be
        if (currentImageWidth != desiredWidth) {
            //calculate the difference in width
            let widthDifference = currentImageWidth - desiredWidth;

            // ==== Step 3 ====
            // Update the image's frame,
            // maintaining it's original x and y values, but with a new width
            self.imageView?.frame = CGRect(imageView.frame.origin.x,
                                           imageView.frame.origin.y,
                                           desiredWidth,
                                           imageView.frame.size.height);

            // ==== Step 4 ====
            // If there is a texst label, we want to move it's x position to
            // ensure it isn't overlapping with the image, and that it has proper spacing with the image
            if let textLabel = self.textLabel
            {
                let originalFrame = self.textLabel?.frame

                // the new X position for the label is just the original position,
                // minus the difference in the image's width
                let newX = textLabel.frame.origin.x - widthDifference
                self.textLabel?.frame = CGRect(newX,
                                               textLabel.frame.origin.y,
                                               contentWidth - newX,
                                               textLabel.frame.size.height);
                print("textLabel info: Original =\(originalFrame!)", "updated=\(self.textLabel!.frame)")
            }

            // ==== Step 4 ====
            // If there is a detail text label, do the same as step 3
            if let detailTextLabel = self.detailTextLabel {
                let originalFrame = self.detailTextLabel?.frame
                let newX = detailTextLabel.frame.origin.x-widthDifference
                self.detailTextLabel?.frame = CGRect(x: newX,
                                                     y: detailTextLabel.frame.origin.y,
                                                     width: contentWidth - newX,
                                                     height: detailTextLabel.frame.size.height);
                print("detailLabel info: Original =\(originalFrame!)", "updated=\(self.detailTextLabel!.frame)")
            }

            // ==== Step 5 ====
            // Set the image's content modoe to scaleAspectFill so it takes up the entire view, but doesn't get distorted
            self.imageView?.contentMode = .scaleAspectFill;
        }
    }
}
Neil Poulin
la source
0

La solution avec laquelle nous avons abouti est similaire à de nombreuses autres. Mais pour obtenir la position correcte du séparateur, nous avons dû le définir avant d'appeler super.layoutSubviews(). Exemple simplifié:

class ImageTableViewCell: UITableViewCell {

    override func layoutSubviews() {
        separatorInset.left = 70
        super.layoutSubviews()

        imageView?.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        textLabel?.frame = CGRect(x: 70, y: 0, width: 200, height: 50)
    }

}
Simon Bengtsson
la source