Bagaimana cara membuat ImageView milik UITableViewCell menjadi ukuran tetap meskipun gambarnya lebih kecil

104

Saya memiliki banyak gambar yang saya gunakan untuk tampilan gambar sel, semuanya tidak lebih besar dari 50x50. mis. 40x50, 50x32, 20x37 .....

Saat saya memuat tampilan tabel, teks tidak sejajar karena lebar gambar bervariasi. Saya juga ingin gambar kecil muncul di tengah, bukan di kiri.

Berikut adalah kode yang saya coba di dalam metode 'cellForRowAtIndexPath' saya

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

Seperti yang Anda lihat, saya telah mencoba beberapa hal, tetapi tidak ada yang berhasil.

Robert
sumber

Jawaban:

152

Tidak perlu menulis ulang semuanya. Saya merekomendasikan melakukan ini sebagai gantinya:

Posting ini di dalam file .m sel kustom Anda.

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

Ini harus melakukan trik dengan baik. :]

Nils Munch
sumber
28
jika Anda mengatur self.imageView.boundsgambar akan menjadi tengah.
BLeB
45
bagaimana jika kita tidak menambahkan subclass dari UITableViewCell?
nonopolaritas
3
@ 動靜 能量: Subclassing UITableViewCell adalah trik utama untuk membuatnya bekerja.
auco
5
Ini tidak berhasil untuk saya. Gambar masih menelan seluruh imageView.
joslinm
14
Itu juga tidak berhasil untuk saya karena labelnya tidak sejajar.
nverinaud
139

Bagi Anda yang belum memiliki subclass 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;
}

Kode di atas menyetel ukurannya menjadi 40x40.

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

Atau Anda dapat menggunakan pendekatan lain (belum diuji) yang disarankan oleh @Tommy:

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

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

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

Kode di atas adalah versi Swift 3+ yang di atas.

Attanasio Jerman
sumber
3
Distorsi gambar dapat diperbaiki dengan UIGraphicsBeginImageContextWithOptions (itemSize, NO, UIScreen.mainScreen.scale); bukannya UIGraphicsBeginImageContext (itemSize);
Kiran Ruth R
1
Jawaban yang bagus. BTW, saya tidak mendapatkan pilihan UIScreen.mainScreen.scalejadi saya pergi saja UIGraphicsBeginImageContext. Juga mengubah ukuran imageView di sel dasar.
denikov
3
@JermanAttanasioRuiz tentang memilih sel itu lagi mengubah ukurannya ke aslinya, apakah seharusnya seperti itu, bagaimana menyelesaikannya.
Bonnie
6
untuk semua orang yang bingung seperti saya, Anda perlu mengatur gambar sebelum memulai konteks. yaitu cell.imageView.image = [UIImage imageNamed: @ "my_image.png"];
Guy Lowe
5
Operasi yang mahal seharusnya tidak menjadi bagian dari cellForRowAtIndexPath
Krizai
33

Begini cara saya melakukannya. Teknik ini menangani pemindahan teks dan label teks detail secara tepat ke kiri:

@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
sumber
Terima kasih, Chris. Ini bekerja dengan sempurna. Anda mungkin ingin memperbaruinya dengan menghapus autorelease karena ARC melarangnya sekarang. Jawaban yang bagus!
CSawy
1
Ini masih solusi terbaik saat ini. Terima kasih.
Rémi Belzanti
Hari-hari ini saya mungkin akan merekomendasikan membuat sel khusus dengan xib atau sel prototipe di papan cerita, dan membuat tampilan gambar lain yang tidak terkait dengan tampilan gambar sel standar. Tapi ini masih cukup sederhana, kurasa!
Chris
1
Saya ingin melakukan semuanya dengan kode daripada menggunakan xib atau storyboard dan ini bekerja dengan sempurna.
Yohanes81
Jawaban ini tidak melakukan apa-apa jika w <diinginkanWith, yang menurut saya adalah kasus penggunaan yang menarik (setidaknya, dalam pertanyaan).
Nate
21

tampilan gambar ditambahkan sebagai sub tampilan ke sel tampilan tabel

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
sumber
1
Jangan lupa untuk merilis imgView jika Anda tidak menggunakan ARC.
Charlie Monroe
14

Seluruh sel tidak perlu dibuat ulang. Anda bisa menggunakan properti indentationLevel dan indentationWidth tableViewCells untuk menggeser konten sel Anda. Kemudian Anda menambahkan imageView kustom Anda ke sisi kiri sel.

Peter Robert
sumber
6

Lebih baik buat tampilan gambar dan tambahkan sebagai tampilan sub ke sel. Kemudian Anda bisa mendapatkan ukuran bingkai yang diinginkan.

pejuang
sumber
Baru saja mencobanya, tampak awal yang bagus tetapi teks di sel sekarang tumpang tindih dengan gambar, bagaimana cara menggeser tampilan konten 50 piksel ke kanan? cell.contentView.bounds = CGRectMake (50, 0, 270, 50); tidak berpengaruh apa pun
Robert
1
Alih-alih menggunakan tampilan default sel, buat label dan tambahkan sebagai sub tampilan ke sel, lalu tetapkan teks ke properti teks label. Dengan ini Anda dapat mendesain sel sesuai kebutuhan Anda.
Warrior
Ini akan lebih membantu jika Anda ingin menampilkan judul, tanggal, deskripsi, dll, lebih banyak nilai dalam sel.
Warrior
Ok, jadi pada dasarnya sakit harus membuat ulang sel secara terprogram. Seharusnya tidak terlalu sulit. Terima kasih untuk bantuannya.
Robert
6

A Simply Swift ,

Langkah 1: Buat Satu SubKelas dari UITableViewCell
Langkah 2: Tambahkan metode ini ke SubKelas UITableViewCell

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

Langkah 3: Buat objek sel menggunakan SubClass in cellForRowAtIndexPath,

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

Langkah 4: Nikmati

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

Ini bekerja untuk saya dengan cepat:

Buat subclass UITableViewCell (pastikan Anda menghubungkan sel Anda di 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)
        }
    }
}

Di cellForRowAtIndexPath, dequeue sel sebagai tipe sel baru Anda:

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

Jelas ubah nilai angka agar sesuai dengan tata letak Anda

Derek
sumber
1

Saya telah membuat ekstensi menggunakan jawaban @GermanAttanasio. Ini menyediakan metode untuk mengubah ukuran gambar ke ukuran yang diinginkan, dan metode lain untuk melakukan hal yang sama sambil menambahkan margin transparan ke gambar (ini dapat berguna untuk tampilan tabel di mana Anda ingin gambar memiliki margin juga).

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

Berikut adalah metode kerja @germanattanasio, yang ditulis untuk 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
sumber
1

Jika Anda menggunakan, cell.imageView?.translatesAutoresizingMaskIntoConstraints = falseAnda dapat mengatur batasan pada imageView. Inilah contoh kerja yang saya gunakan dalam sebuah proyek. Saya menghindari subclass dan tidak perlu membuat storyboard dengan sel prototipe tetapi membutuhkan waktu yang cukup lama untuk menjalankannya, jadi mungkin paling baik hanya digunakan jika tidak ada cara yang lebih sederhana atau lebih ringkas yang tersedia untuk Anda.

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

UITableViewCell biasa bekerja dengan baik untuk memposisikan sesuatu tetapi cell.imageView tampaknya tidak berperilaku seperti yang Anda inginkan. Saya menemukan bahwa itu cukup sederhana untuk membuat UITableViewCell ditata dengan benar dengan terlebih dahulu memberikan cell.imageView gambar berukuran tepat seperti

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

Kemudian Anda bisa menghubungkan UIImageView Anda sendiri yang berfungsi dengan baik

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

Setel gambar pada anImageView dan itu akan melakukan apa yang Anda harapkan dari UIImageView. Jadilah ukuran yang Anda inginkan terlepas dari gambar yang Anda berikan. Ini harus masuk ke tableView: cellForRowAtIndexPath:

Gerard
sumber
0

Solusi ini pada dasarnya menggambar gambar sebagai 'aspek fit' dalam persegi yang diberikan.

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

Saya memiliki masalah yang sama. Terima kasih kepada semua orang yang menjawab - Saya bisa mendapatkan solusi bersama menggunakan bagian dari beberapa jawaban ini.

Solusi saya menggunakan swift 5

Masalah yang kami coba selesaikan adalah kami mungkin memiliki gambar dengan rasio aspek yang berbeda di kami TableViewCell , tetapi kami ingin gambar tersebut dirender dengan lebar yang konsisten. Gambar harus, tentu saja, dirender tanpa distorsi dan memenuhi seluruh ruang. Dalam kasus saya, saya baik-baik saja dengan beberapa "pemotongan" dari gambar tinggi dan kurus, jadi saya menggunakan mode konten.scaleAspectFill

Untuk melakukan ini, saya membuat subkelas khusus dari UITableViewCell. Dalam kasus saya, saya menamakannyaStoryTableViewCell . Seluruh kelas ditempel di bawah, dengan komentar sebaris.

Pendekatan ini berhasil untuk saya saat juga menggunakan Tampilan Aksesori kustom dan label teks panjang. Berikut gambar hasil akhirnya:

Tampilan Tabel Rendered dengan lebar gambar yang konsisten

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

Solusi yang kami dapatkan serupa dengan banyak solusi lainnya. Tetapi untuk mendapatkan posisi pemisah yang benar, kami harus mengaturnya sebelum menelepon super.layoutSubviews(). Contoh yang disederhanakan:

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
sumber