UITableViewCell'in ImageView'unu, resim daha küçük olsa bile nasıl sabit bir boyut haline getirebilirim?


104

Hücrenin resim görünümleri için kullandığım bir sürü resim var, hepsi 50x50'den büyük değil. örneğin 40x50, 50x32, 20x37 .....

Tablo görünümünü yüklediğimde, görüntülerin genişliği değiştiği için metin hizalanmıyor. Ayrıca soldaki yerine merkezde küçük resimlerin görünmesini istiyorum.

İşte 'cellForRowAtIndexPath' yöntemimin içinde denediğim kod

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

Gördüğünüz gibi birkaç şey denedim ama hiçbiri işe yaramıyor.

Yanıtlar:


152

Her şeyi yeniden yazmak gerekli değildir. Bunun yerine şunu yapmanızı tavsiye ederim:

Bunu özel hücrenizin .m dosyanıza gönderin.

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

Bu işi güzelce yapmalı. :]


28
Eğer ayarlarsanız self.imageView.boundsgörüntü ortalanacaktır.
BLeB

45
ya bir alt sınıf eklemezsek UITableViewCell?
nonopolarite

3
@ 動靜 能量: UITableViewCell'i alt sınıflara ayırmak, bunun çalışmasını sağlamak için ana hiledir.
auco

5
Bu benim için çalışmıyor. Görüntü hala tüm imageView'i yutar.
joslinm

14
Etiketler yanlış hizalandığı için benim için de çalışmıyor.
nverinaud

139

Alt sınıfına sahip olmayanlarınız için 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;
}

Yukarıdaki kod, boyutu 40x40 olarak ayarlar.

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

Veya @Tommy tarafından önerilen başka bir (test edilmemiş) yaklaşımı kullanabilirsiniz:

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

Yukarıdaki kod, yukarıdakinin Swift 3+ sürümüdür.


3
Görüntü bozulması UIGraphicsBeginImageContextWithOptions (itemSize, NO, UIScreen.mainScreen.scale) ile düzeltilebilir; UIGraphicsBeginImageContext (itemSize) yerine;
Kiran Ruth R

1
İyi cevap. BTW, seçeneğini alamadım, UIScreen.mainScreen.scalebu yüzden sadece gittim UIGraphicsBeginImageContext. Ayrıca temel hücrede imageView yeniden boyutlandırıldı.
denikov

3
@GermanAttanasioRuiz hücreyi seçerken tekrar orijinaline yeniden boyutlandırıyor, öyle mi olmalı, nasıl çözülür.
Bonnie

6
Benim gibi kafası karışan herkes için bağlamın başlangıcından önce görüntüyü ayarlamanız gerekir. yani, cell.imageView.image = [UIImage imageNamed: @ "my_image.png"];
Guy Lowe

5
Bu tür maliyetli işlemler, cellForRowAtIndexPath'in bir parçası olmamalı
Krizai

33

İşte böyle yaptım. Bu teknik, metin ve ayrıntı metin etiketlerini uygun şekilde sola taşımayı sağlar:

@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;
}

Teşekkürler Chris. Bu mükemmel çalıştı. ARC bunu şimdi yasakladığı için otomatik serbest bırakmayı kaldırarak güncellemek isteyebilirsiniz. Yine de harika cevap!
CSawy

1
Bu, bugün hala en iyi çözümdür. Teşekkür ederim.
Rémi Belzanti

Bu günlerde, muhtemelen bir film şeridinde bir xib veya prototip hücre içeren özel bir hücre oluşturmanızı ve standart bir hücrenin görüntü görünümüyle ilgisi olmayan tamamen başka bir görüntü görünümü oluşturmanızı öneririm. Ama bu hala yeterince basit, sanırım!
Chris

1
Xib veya storyboard kullanmak yerine kodla her şeyi yapmak istiyorum ve bu mükemmel çalıştı.
John81

Bu cevap, w <wantWith, bana göre ilgi konusu kullanım durumuysa (en azından soruda) hiçbir şey yapmaz.
Nate

21

resim görünümü tablo görünümü hücresine bir alt görünüm olarak eklenir

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

1
ARC kullanmıyorsanız imgView'ı yayınlamayı unutmayın.
Charlie Monroe

14

Tüm hücrenin yeniden yapılması gerekmiyor. Hücrenizin içeriğini değiştirmek için tableViewCells'in indentationLevel ve indentationWidth özelliğini kullanabilirsiniz. Ardından, hücrenin sol tarafına özel imageView'ınızı eklersiniz.


6

Daha iyi bir görüntü görünümü oluşturun ve bunu hücreye bir alt görünüm olarak ekleyin, ardından istediğiniz çerçeve boyutunu elde edebilirsiniz.


Bunu denedim, iyi bir başlangıç ​​görünüyor ama hücrelerdeki metin artık görüntülerle örtüşüyor, içerik görünümünü 50 piksel sağa nasıl kaydırırım? cell.contentView.bounds = CGRectMake (50, 0, 270, 50); herhangi bir etkisi yoktur
Robert

1
Hücre varsayılan görünümünü kullanmak yerine etiket oluşturun ve bunu hücreye bir alt görünüm olarak ekleyin, ardından metni etiket metni özelliğine atayın. Bununla hücreyi ihtiyacınıza göre tasarlayabilirsiniz.
Warrior

Bir hücrede başlık, tarih, açıklama vb. Daha fazla değer görüntülemek istiyorsanız bu daha yararlı olacaktır.
Warrior

Tamam, yani temelde hasta hücreyi programlı olarak yeniden yapmak zorunda. Çok zor olmamalı. Yardım için teşekkürler.
Robert

6

A Simply Swift ,

Adım 1: UITableViewCell
Adım 2'nin Bir Alt Sınıfını Oluşturun : Bu yöntemi UITableViewCell'in Alt Sınıfına ekleyin

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

Adım 3: Bu Alt Sınıfı kullanarak hücre nesnesi oluşturun cellForRowAtIndexPath,

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

4. Adım: Keyfini çıkarın


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

2

Bu benim için hızlı çalıştı:

UITableViewCell'in bir alt sınıfını oluşturun (film şeridinde hücrenizi bağladığınızdan emin olun)

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

CellForRowAtIndexPath içinde, yeni hücre türünüz olarak hücrenin sırasını kaldırın:

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

Düzeninize uyacak şekilde sayı değerlerini açıkça değiştirin


1

@GermanAttanasio'nun cevabını kullanarak bir uzantı oluşturdum. Bir görüntüyü istenen boyutta yeniden boyutlandırmak için bir yöntem ve görüntüye şeffaf bir kenar boşluğu eklerken aynı şeyi yapmak için başka bir yöntem sağlar (bu, görüntünün kenar boşluğunun olmasını istediğiniz tablo görünümleri için de yararlı olabilir).

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

1

İşte @germanattanasio'nun Swift 3 için yazdığı çalışma yöntemi

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

1

Kullanıyorsanız cell.imageView?.translatesAutoresizingMaskIntoConstraints = false, imageView üzerinde kısıtlamalar ayarlayabilirsiniz. İşte bir projede kullandığım çalışan bir örnek. Alt sınıflamadan kaçındım ve prototip hücrelerle storyboard oluşturmam gerekmedi, ancak çalışmaya başlamak için epey zamanımı aldım, bu yüzden muhtemelen yalnızca sizin için daha basit veya daha özlü bir yol yoksa kullanmak en iyisidir.

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
}

0

Normal UITableViewCell, nesneleri konumlandırmak için iyi çalışır, ancak cell.imageView, istediğiniz gibi davranmıyor gibi görünüyor. İlk önce hücreyi vererek UITableViewCell'in düzgün bir şekilde yerleştirilmesini sağlamanın yeterince basit olduğunu buldum. İmageView gibi uygun boyutta bir görüntü

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

Daha sonra düzgün çalışan kendi UIImageView ile bağlantı kurabilirsiniz.

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

Görüntüyü birImageView'da ayarlayın ve bir UIImageView'ın yapmasını beklediğiniz şeyi yapacaktır. Verdiğiniz görüntü ne olursa olsun, istediğiniz boyutta olun. Bu, tableView: cellForRowAtIndexPath'e gitmelidir:


0

Bu çözüm, temelde görüntüyü verilen doğrultuda 'görünüş uyumu' olarak çizer.

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

0

Ben de aynı sorunu yaşadım. Cevap veren herkese teşekkür ederim - Bu cevapların birkaçını kullanarak birlikte bir çözüm bulabildim.

Benim çözümüm Swift 5 kullanıyor

Çözmeye çalıştığımız sorun, kendi boyutlarımızda farklı en boy oranlarına sahip görüntülere sahip olabileceğimiz, TableViewCellancak bunların tutarlı genişliklerle oluşturulmasını istiyoruz. Görüntüler elbette bozulmadan işlenmeli ve tüm alanı doldurmalıdır. Benim durumumda, uzun, ince resimlerin bazı "kırpılmasında" sorun yaşamadım, bu yüzden içerik modunu kullandım.scaleAspectFill

Bunu yapmak için özel bir alt sınıf oluşturdum UITableViewCell. Benim durumumda adını ben koydum StoryTableViewCell. Tüm sınıf, yorumlar satır içi olarak aşağıya yapıştırılmıştır.

Özel bir Aksesuar Görünümü ve uzun metin etiketleri kullanırken de bu yaklaşım benim için işe yaradı. İşte nihai sonucun bir görüntüsü:

Tutarlı görüntü genişliğine sahip İşlenmiş Tablo Görünümü

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

0

Elde ettiğimiz çözüm, diğerlerinin çoğuna benziyor. Ancak ayırıcının doğru konumunu elde etmek için aramadan önce ayarlamamız gerekiyordu super.layoutSubviews(). Basitleştirilmiş örnek:

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.