Wie mache ich UITableViewCells ImageView zu einer festen Größe, auch wenn das Bild kleiner ist?

104

Ich habe eine Reihe von Bildern, die ich für die Bildansichten der Zelle verwende. Sie sind alle nicht größer als 50 x 50. zB 40x50, 50x32, 20x37 .....

Wenn ich die Tabellenansicht lade, wird der Text nicht ausgerichtet, da die Breite der Bilder variiert. Außerdem möchte ich, dass kleine Bilder in der Mitte und nicht links angezeigt werden.

Hier ist der Code, den ich in meiner Methode 'cellForRowAtIndexPath' versuche

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

Wie Sie sehen, habe ich einige Dinge ausprobiert, aber keines davon funktioniert.

Robert
quelle

Antworten:

152

Es ist nicht notwendig, alles neu zu schreiben. Ich empfehle dies stattdessen:

Veröffentlichen Sie dies in Ihrer .m-Datei Ihrer benutzerdefinierten Zelle.

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

Dies sollte den Trick gut machen. :]

Nils Munch
quelle
28
Wenn Sie einstellen, wird self.imageView.boundsdas Bild zentriert.
BLeB
45
Was ist, wenn wir keine Unterklasse von hinzufügen UITableViewCell?
Unpolarität
3
@ 動靜 能量: Die Unterklasse von UITableViewCell ist der Haupttrick, damit dies funktioniert.
Auco
5
Das funktioniert bei mir nicht. Das Bild verschlingt immer noch die gesamte Bildansicht.
Joslinm
14
Es funktioniert auch bei mir nicht, da die Etiketten falsch ausgerichtet sind.
Nverinaud
139

Für diejenigen unter Ihnen, die keine Unterklasse haben von 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;
}

Der obige Code legt die Größe auf 40 x 40 fest.

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();

Oder Sie können einen anderen (nicht getesteten) Ansatz verwenden, der von @Tommy vorgeschlagen wird:

- (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();

Der obige Code ist die Swift 3+ -Version des oben genannten.

Deutscher Attanasio
quelle
3
Bildverzerrungen können durch UIGraphicsBeginImageContextWithOptions (itemSize, NO, UIScreen.mainScreen.scale) behoben werden. anstelle von UIGraphicsBeginImageContext (itemSize);
Kiran Ruth R
1
Gute Antwort. Übrigens, ich hatte nicht die Möglichkeit dazu, UIScreen.mainScreen.scalealso ging ich einfach mit UIGraphicsBeginImageContext. Ändern Sie auch die Größe der imageView in der Basiszelle.
Denikov
3
@GermanAttanasioRuiz bei der Auswahl der Zelle ändert sich die Größe wieder auf das Original, soll es so sein, wie man das löst.
Bonnie
6
Für alle, die wie ich verwirrt waren, müssen Sie das Bild vor dem Beginn des Kontexts festlegen. dh cell.imageView.image = [UIImage imageNamed: @ "my_image.png"];
Guy Lowe
5
Solch kostspielige Operationen sollten nicht Teil von cellForRowAtIndexPath
Krizai
33

Hier ist, wie ich es gemacht habe. Bei dieser Technik werden die Text- und Detailtextbeschriftungen entsprechend nach links verschoben:

@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
quelle
Danke, Chris. Das hat perfekt funktioniert. Möglicherweise möchten Sie es aktualisieren, indem Sie die Autorelease entfernen, da ARC dies jetzt verbietet. Tolle Antwort!
CSawy
1
Dies ist auch heute noch die beste Lösung. Danke dir.
Rémi Belzanti
Heutzutage würde ich wahrscheinlich empfehlen, eine benutzerdefinierte Zelle mit einer xib- oder einer Prototypzelle in einem Storyboard zu erstellen und eine ganz andere Bildansicht zu erstellen, die nicht mit der Bildansicht einer Standardzelle zusammenhängt. Aber das ist immer noch einfach genug, denke ich!
Chris
1
Ich möchte alles mit Code machen, anstatt ein xib oder Storyboard zu verwenden, und das hat perfekt funktioniert.
John81
Diese Antwort tut nichts, wenn w <gewünscht ist, was meiner Meinung nach der Anwendungsfall von Interesse ist (zumindest in der Frage).
Nate
21

Bildansicht als Unteransicht zur Tabellenansichtszelle hinzufügen

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
quelle
1
Vergessen Sie nicht, imgView freizugeben, wenn Sie ARC nicht verwenden.
Charlie Monroe
14

Die ganze Zelle muss nicht neu erstellt werden. Sie können die Eigenschaften indentationLevel und indentationWidth von tableViewCells verwenden, um den Inhalt Ihrer Zelle zu verschieben. Anschließend fügen Sie Ihre benutzerdefinierte Bildansicht auf der linken Seite der Zelle hinzu.

Peter Robert
quelle
6

Erstellen Sie besser eine Bildansicht und fügen Sie sie der Zelle als Unteransicht hinzu. Dann können Sie die gewünschte Bildgröße erhalten.

Krieger
quelle
Ich habe es gerade versucht, es sieht gut aus, aber der Text in den Zellen überlappt jetzt die Bilder. Wie verschiebe ich die Inhaltsansicht um 50 Pixel nach rechts? cell.contentView.bounds = CGRectMake (50, 0, 270, 50); hat keine Wirkung
Robert
1
Anstatt die Standardansicht der Zelle zu verwenden, erstellen Sie eine Beschriftung, fügen Sie sie der Zelle als Unteransicht hinzu und weisen Sie den Text dann der Beschriftungstext-Eigenschaft zu. Auf diese Weise können Sie die Zelle gemäß Ihren Anforderungen entwerfen.
Krieger
Dies ist hilfreicher, wenn Sie Titel, Datum, Beschreibung usw. sowie weitere Werte in einer Zelle anzeigen möchten.
Krieger
Ok, also muss ich die Zelle grundsätzlich programmgesteuert neu erstellen. Sollte nicht zu schwer sein. Danke für die Hilfe.
Robert
6

Ein einfach schneller ,

Schritt 1: Erstellen einer Unterklasse von UITableViewCell
Schritt 2: Fügen Sie diese Methode der Unterklasse von UITableViewCell hinzu

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

Schritt 3: Erstellen Sie ein Zellenobjekt mit dieser Unterklasse in cellForRowAtIndexPath.

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

Schritt 4: Viel Spaß

Mohammad Zaid Pathan
quelle
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
quelle
2

Das hat bei mir schnell geklappt:

Erstellen Sie eine Unterklasse von UITableViewCell (stellen Sie sicher, dass Sie Ihre Zelle im Storyboard verknüpfen).

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

Deaktivieren Sie in cellForRowAtIndexPath die Zelle als neuen Zelltyp:

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

Ändern Sie natürlich die Zahlenwerte entsprechend Ihrem Layout

Derek
quelle
1

Ich habe eine Erweiterung mit der Antwort von @GermanAttanasio erstellt. Es bietet eine Methode zum Ändern der Größe eines Bilds auf die gewünschte Größe und eine andere Methode, um dasselbe zu tun, während dem Bild ein transparenter Rand hinzugefügt wird (dies kann für Tabellenansichten nützlich sein, bei denen das Bild auch einen Rand haben soll).

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
quelle
1

Hier ist die Arbeitsmethode von @germanattanasio, die für Swift 3 geschrieben wurde

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()
}
FredericP
quelle
1

Wenn Sie verwenden cell.imageView?.translatesAutoresizingMaskIntoConstraints = false, können Sie Einschränkungen für die imageView festlegen. Hier ist ein Arbeitsbeispiel, das ich in einem Projekt verwendet habe. Ich habe Unterklassen vermieden und musste kein Storyboard mit Prototypzellen erstellen, aber es hat eine ganze Weile gedauert, bis ich es zum Laufen gebracht habe. Daher ist es wahrscheinlich am besten, es nur zu verwenden, wenn Ihnen kein einfacherer oder prägnanterer Weg zur Verfügung steht.

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
quelle
0

Die reguläre UITableViewCell funktioniert gut, um Dinge zu positionieren, aber die cell.imageView scheint sich nicht so zu verhalten, wie Sie es möchten. Ich fand, dass es einfach genug ist, die UITableViewCell zum richtigen Layout zu bringen, indem man der cell.imageView zuerst ein Bild mit der richtigen Größe gibt

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

Dann können Sie einfach Ihr eigenes ordnungsgemäß funktionierendes UIImageView mit verbinden

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

Stellen Sie das Bild auf anImageView ein und es wird das tun, was Sie von einem UIImageView erwarten. Seien Sie die gewünschte Größe, unabhängig von dem Bild, das Sie ihm geben. Dies sollte in tableView erfolgen: cellForRowAtIndexPath:

Gerard
quelle
0

Diese Lösung zeichnet das Bild im Wesentlichen als "Aspektanpassung" innerhalb des gegebenen Rechtecks.

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();
Nick
quelle
0

Ich hatte das gleiche Problem. Vielen Dank an alle anderen, die geantwortet haben. Ich konnte anhand von Teilen mehrerer dieser Antworten eine Lösung zusammenstellen.

Meine Lösung verwendet Swift 5

Das Problem, das wir zu lösen versuchen, ist, dass wir möglicherweise Bilder mit unterschiedlichen Seitenverhältnissen in unseren TableViewCells haben, aber wir möchten, dass sie mit konsistenten Breiten gerendert werden. Die Bilder sollten natürlich verzerrungsfrei gerendert werden und den gesamten Raum ausfüllen. In meinem Fall war ich damit einverstanden, große, dünne Bilder zu "beschneiden", also habe ich den Inhaltsmodus verwendet.scaleAspectFill

Zu diesem Zweck habe ich eine benutzerdefinierte Unterklasse von erstellt UITableViewCell. In meinem Fall habe ich es benannt StoryTableViewCell. Die gesamte Klasse wird unten mit Inline-Kommentaren eingefügt.

Dieser Ansatz hat bei mir funktioniert, wenn ich auch eine benutzerdefinierte Zubehöransicht und lange Textbeschriftungen verwendet habe. Hier ist ein Bild des Endergebnisses:

Gerenderte Tabellenansicht mit konsistenter Bildbreite

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
quelle
0

Die Lösung, die wir gefunden haben, ähnelt vielen anderen. Aber um die richtige Position des Trennzeichens zu erhalten, mussten wir es vor dem Aufruf einstellen super.layoutSubviews(). Vereinfachtes Beispiel:

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
quelle