Jak ustawić ImageView UITableViewCell o stałym rozmiarze, nawet jeśli obraz jest mniejszy

104

Mam kilka obrazów, których używam do widoków obrazów komórki, wszystkie nie są większe niż 50x50. np. 40x50, 50x32, 20x37 .....

Kiedy ładuję widok tabeli, tekst nie jest wyrównany, ponieważ szerokość obrazów jest różna. Chciałbym również, aby małe obrazy pojawiały się w środku, a nie po lewej stronie.

Oto kod, który próbuję w mojej metodzie „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];

Jak widać, wypróbowałem kilka rzeczy, ale żadna z nich nie działa.

Robert
źródło

Odpowiedzi:

152

Nie ma potrzeby przepisywania wszystkiego. Zamiast tego polecam:

Opublikuj to w swoim pliku .m swojej komórki niestandardowej.

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

To powinno załatwić sprawę. :]

Nils Munch
źródło
28
jeśli ustawisz self.imageView.boundsobraz zostanie wyśrodkowany.
BLeB
45
co, jeśli nie dodamy podklasy UITableViewCell?
biegunowości
3
@ 動靜 能量: Tworzenie podklas UITableViewCell jest główną sztuczką, aby to działało.
auco
5
To nie działa dla mnie. Obraz nadal obejmuje cały imageView.
joslinm
14
U mnie też nie działa, ponieważ etykiety są źle wyrównane.
nverinaud
139

Dla tych z Was, którzy nie mają podklasy 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;
}

Powyższy kod ustawia rozmiar na 40x40.

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

Lub możesz użyć innego (nie przetestowanego) podejścia sugerowanego przez @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();

Powyższy kod jest wersją Swift 3+ powyższego.

Niemiecki Attanasio
źródło
3
Zniekształcenie obrazu można naprawić za pomocą UIGraphicsBeginImageContextWithOptions (itemSize, NO, UIScreen.mainScreen.scale); zamiast UIGraphicsBeginImageContext (itemSize);
Kiran Ruth R
1
Dobra odpowiedź. Przy okazji, nie dostałem opcji, UIScreen.mainScreen.scalewięc po prostu poszedłem UIGraphicsBeginImageContext. Zmieniono również rozmiar imageView w podstawowej komórce.
denikov
3
@GermanAttanasioRuiz po wybraniu komórki ponownie zmienia rozmiar do oryginału, czy tak ma być, jak to rozwiązać.
Bonnie
6
dla wszystkich, którzy tak jak ja byli zdezorientowani, musisz ustawić obraz przed rozpoczęciem kontekstu. tj. cell.imageView.image = [UIImage imageNamed: @ "my_image.png"];
Guy Lowe,
5
Takie kosztowne operacje nie powinny być częścią cellForRowAtIndexPath
Krizai
33

Oto jak to zrobiłem. Ta technika pozwala odpowiednio przesuwać tekst i szczegółowe etykiety tekstowe w lewo:

@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
źródło
Dzięki, Chris. To działało doskonale. Możesz go zaktualizować, usuwając automatyczne udostępnianie, ponieważ ARC zabrania go teraz. Świetna odpowiedź!
Cawy
1
To wciąż najlepsze rozwiązanie dzisiaj. Dziękuję Ci.
Rémi Belzanti
W dzisiejszych czasach prawdopodobnie zalecałbym utworzenie niestandardowej komórki z xib lub komórką prototypową w scenorysie i utworzenie zupełnie innego widoku obrazu niezwiązanego z widokiem obrazu standardowej komórki. Ale to wciąż jest dość proste, jak sądzę!
Chris
1
Chcę robić wszystko z kodem zamiast używać xib lub storyboardu i to działało idealnie.
John81
Ta odpowiedź nic nie daje, jeśli w <pożądaneWith, co wydaje mi się być interesującym przypadkiem użycia (przynajmniej w pytaniu).
Nate
21

widok obrazu dodaj jako widok podrzędny do komórki widoku tabeli

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
źródło
1
Nie zapomnij wypuścić imgView, jeśli nie używasz ARC.
Charlie Monroe
14

Cała komórka nie musi być przerabiana. Możesz użyć indentationLevel i indentationWidth właściwości tableViewCells, aby przesunąć zawartość komórki. Następnie dodaj swój niestandardowy imageView po lewej stronie komórki.

Peter Robert
źródło
6

Lepiej utwórz widok obrazu i dodaj go jako widok podrzędny do komórki, aby uzyskać żądany rozmiar ramki.

Wojownik
źródło
Właśnie spróbowałem, wygląda na dobry początek, ale tekst w komórkach teraz nakłada się na obrazy, jak przesunąć widok zawartości o 50 pikseli w prawo? cell.contentView.bounds = CGRectMake (50, 0, 270, 50); nie ma żadnego efektu
Robert
1
Zamiast używać domyślnego widoku komórki, utwórz etykietę i dodaj ją jako widok podrzędny do komórki, a następnie przypisz tekst do właściwości tekstu etykiety. W ten sposób możesz zaprojektować komórkę zgodnie z wymaganiami.
Warrior
Będzie to bardziej pomocne, jeśli chcesz wyświetlić tytuł, datę, opis itp., Więcej wartości w komórce.
Warrior
Ok, więc w zasadzie chory muszę programowo przerobić komórkę. Nie powinno być zbyt trudne. Dzięki za pomoc.
Robert
6

Po prostu szybki ,

Krok 1: Utwórz jedną podklasę UITableViewCell
kroku 2: Dodaj tę metodę do SubClass of UITableViewCell

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

Krok 3: Utwórz obiekt komórki za pomocą tej podklasy w cellForRowAtIndexPath,

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

Krok 4: Ciesz się

Mohammad Zaid Pathan
źródło
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
źródło
2

To zadziałało dla mnie szybko:

Utwórz podklasę UITableViewCell (upewnij się, że łączysz komórkę w serii ujęć)

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

W cellForRowAtIndexPath usuń z kolejki komórkę jako nowy typ komórki:

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

Oczywiście zmień wartości liczbowe, aby pasowały do ​​twojego układu

Derek
źródło
1

Stworzyłem rozszerzenie używając odpowiedzi @GermanAttanasio. Zapewnia metodę zmiany rozmiaru obrazu do żądanego rozmiaru, a także inną metodę, aby zrobić to samo, dodając przezroczysty margines do obrazu (może to być przydatne w przypadku widoków tabeli, w których obraz ma również mieć margines).

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
źródło
1

Oto metoda pracy @germanattanasio, napisana dla 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()
}
FredericP
źródło
1

Jeśli używasz cell.imageView?.translatesAutoresizingMaskIntoConstraints = false, możesz ustawić ograniczenia w imageView. Oto działający przykład, którego użyłem w projekcie. Uniknąłem tworzenia podklas i nie musiałem tworzyć scenorysu z prototypowymi komórkami, ale zajęło mi to trochę czasu, aby uruchomić, więc prawdopodobnie najlepiej używać tylko wtedy, gdy nie ma prostszego lub bardziej zwięzłego sposobu.

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
źródło
0

Zwykły UITableViewCell działa dobrze do pozycjonowania rzeczy, ale cell.imageView nie wydaje się zachowywać tak, jak chcesz. Zauważyłem, że dość łatwo jest sprawić, aby UITableViewCell rozłożył się poprawnie, najpierw dając cell.imageView obraz o odpowiednim rozmiarze, taki jak

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

Następnie możesz po prostu podłączyć swój własny poprawnie działający UIImageView z

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

Ustaw obraz na AnImageView, a zrobi to, czego oczekujesz od UIImageView. Bądź taki, jaki chcesz, niezależnie od obrazu, który mu nadasz. Powinno to znaleźć się w tableView: cellForRowAtIndexPath:

Gerard
źródło
0

To rozwiązanie zasadniczo rysuje obraz jako „dopasowanie kształtu” w ramach danego prostego.

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();
Nacięcie
źródło
0

Miałem ten sam problem. Dziękuję wszystkim, którzy odpowiedzieli - udało mi się wspólnie znaleźć rozwiązanie, korzystając z części kilku z tych odpowiedzi.

Moim rozwiązaniem jest użycie Swift 5

Problem, który próbujemy rozwiązać, polega na tym, że możemy mieć obrazy o różnych proporcjach w naszych obrazach, TableViewCellale chcemy, aby były renderowane ze stałą szerokością. Obrazy powinny oczywiście renderować się bez zniekształceń i wypełniać całą przestrzeń. W moim przypadku nie przeszkadzało mi trochę „przycinanie” wysokich, chudych obrazów, więc użyłem trybu treści.scaleAspectFill

Aby to zrobić, utworzyłem niestandardową podklasę UITableViewCell. W moim przypadku nazwałem to StoryTableViewCell. Cała klasa jest wklejona poniżej, z komentarzami w tekście.

To podejście zadziałało, gdy korzystałem również z niestandardowego widoku akcesoriów i długich etykiet tekstowych. Oto obraz wyniku końcowego:

Renderowany widok tabeli ze stałą szerokością obrazu

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
źródło
0

Rozwiązanie, które otrzymaliśmy, jest podobne do wielu innych. Ale aby uzyskać właściwą pozycję separatora, musieliśmy ustawić go przed wywołaniem super.layoutSubviews(). Uproszczony przykład:

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
źródło