Làm cách nào để đặt ImageView của UITableViewCell có kích thước cố định ngay cả khi hình ảnh nhỏ hơn


104

Tôi có một loạt hình ảnh tôi đang sử dụng cho chế độ xem hình ảnh của ô, tất cả chúng đều không lớn hơn 50x50. ví dụ: 40x50, 50x32, 20x37 .....

Khi tôi tải chế độ xem bảng, văn bản không thẳng hàng vì chiều rộng của hình ảnh khác nhau. Ngoài ra, tôi muốn những hình ảnh nhỏ xuất hiện ở trung tâm thay vì ở bên trái.

Đây là mã tôi đang thử bên trong phương thức 'cellForRowAtIndexPath' của mình

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

Như bạn có thể thấy, tôi đã thử một vài cách, nhưng không cái nào hoạt động.

Câu trả lời:


152

Không cần thiết phải viết lại mọi thứ. Tôi khuyên bạn nên làm điều này thay vì:

Đăng điều này bên trong tệp .m của ô tùy chỉnh của bạn.

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

Điều này sẽ thực hiện thủ thuật độc đáo. :]


28
nếu bạn đặt self.imageView.boundshình ảnh sẽ được căn giữa.
BLeB

45
điều gì sẽ xảy ra nếu chúng ta không thêm một lớp con của UITableViewCell?
nonopolarity

3
@ 動靜 能量: Phân lớp UITableViewCell là thủ thuật chính để làm cho nó hoạt động.
auco

5
Điều này không làm việc cho tôi. Hình ảnh vẫn bao phủ toàn bộ imageView.
joslinm

14
Nó cũng không hoạt động đối với tôi vì các nhãn bị lệch.
nverinaud

139

Dành cho những bạn không có lớp con của 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;
}

Đoạn mã trên đặt kích thước là 40x40.

Swift 2

    let itemSize = CGSizeMake(25, 25);
    UIGraphicsBeginImageContextWithOptions(itemSize, false, UIScreen.mainScreen().scale);
    let imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
    cell.imageView?.image!.drawInRect(imageRect)
    cell.imageView?.image! = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

Hoặc bạn có thể sử dụng một phương pháp khác (chưa được thử nghiệm) do @Tommy đề xuất:

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

Đoạn mã trên là phiên bản Swift 3+ ở trên.


3
Sự biến dạng hình ảnh có thể được sửa bằng UIGraphicsBeginImageContextWithOptions (itemSize, NO, UIScreen.mainScreen.scale); thay vì UIGraphicsBeginImageContext (itemSize);
Kiran Ruth R

1
Câu trả lời tốt. BTW, tôi không có tùy chọn UIScreen.mainScreen.scalevì vậy tôi chỉ đi với UIGraphicsBeginImageContext. Đồng thời thay đổi kích thước imageView trong ô cơ bản.
acceptkov

3
@GermanAttanasioRuiz khi chọn ô nó lại thay đổi kích thước như ban đầu, lẽ ra nó phải như vậy, cách giải quyết.
Bonnie

6
Đối với tất cả những người bối rối như tôi, bạn cần phải thiết lập hình ảnh trước khi bắt đầu bối cảnh. tức là cell.imageView.image = [UIImage imageNamed: @ "my_image.png"];
Guy Lowe

5
Một hoạt động tốn kém như vậy không phải là một phần của cellForRowAtIndexPath
Krizai

33

Đây là cách tôi đã làm điều đó. Kỹ thuật này xử lý việc di chuyển văn bản và các nhãn văn bản chi tiết sang bên trái một cách thích hợp:

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

Cảm ơn, Chris. Điều này đã hoạt động hoàn hảo. Bạn có thể muốn cập nhật nó bằng cách xóa autorelease vì ARC hiện cấm nó. Câu trả lời tuyệt vời mặc dù!
CSawy

1
Đây vẫn là giải pháp tốt nhất hiện nay. Cảm ơn bạn.
Rémi Belzanti

Những ngày này, tôi có thể khuyên bạn nên tạo ô tùy chỉnh với xib hoặc ô nguyên mẫu trong bảng phân cảnh và tạo toàn bộ chế độ xem hình ảnh khác không liên quan đến chế độ xem hình ảnh của ô tiêu chuẩn. Nhưng điều này vẫn đủ đơn giản, tôi đoán!
Chris

1
Tôi muốn làm mọi thứ với mã thay vì sử dụng xib hoặc bảng phân cảnh và điều này đã hoạt động hoàn hảo.
John81

Câu trả lời này không có tác dụng gì nếu w <mong muốnVới, mà đối với tôi có vẻ là trường hợp sử dụng được quan tâm (ít nhất, trong câu hỏi).
Nate

21

chế độ xem hình ảnh thêm làm chế độ xem phụ vào ô chế độ xem bảng

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
Đừng quên phát hành imgView nếu bạn không sử dụng ARC.
Charlie Monroe

14

Toàn bộ ô không cần phải được làm lại. Bạn có thể sử dụng thuộc tính indentationLevel và indentationWidth của tableViewCells để chuyển nội dung ô của bạn. Sau đó, bạn thêm imageView tùy chỉnh của mình vào phía bên trái của ô.


6

Tốt hơn hãy tạo chế độ xem hình ảnh và thêm nó làm chế độ xem phụ vào ô, sau đó bạn có thể có được kích thước khung hình mong muốn.


Chỉ mới thử vậy, bắt đầu có vẻ tốt nhưng văn bản trong các ô hiện chồng lên hình ảnh, làm cách nào để chuyển chế độ xem nội dung 50 pixel sang bên phải? cell.contentView.bounds = CGRectMake (50, 0, 270, 50); không có bất kỳ ảnh hưởng nào
Robert

1
Thay vì sử dụng dạng xem mặc định của ô, hãy tạo nhãn và thêm nó dưới dạng dạng xem phụ vào ô, sau đó gán văn bản cho thuộc tính văn bản nhãn. Bằng cách này, bạn có thể thiết kế ô theo yêu cầu của bạn.
Warrior

Điều này sẽ hữu ích hơn nếu bạn muốn hiển thị tiêu đề, ngày tháng, mô tả, v.v., nhiều giá trị hơn trong một ô.
Warrior

Được rồi, về cơ bản tôi phải làm lại ô theo chương trình. Không nên quá khó. Cảm ơn đã giúp đỡ.
Robert

6

Một Swift Đơn giản ,

Bước 1: Tạo một lớp con của UITableViewCell
Bước 2: Thêm phương thức này vào lớp con của UITableViewCell

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

Bước 3: Tạo đối tượng ô bằng SubClass đó trong cellForRowAtIndexPath,

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

Bước 4: Thưởng thức


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

Điều này đã làm việc cho tôi nhanh chóng:

Tạo một lớp con của UITableViewCell (đảm bảo bạn liên kết ô của mình trong bảng phân cảnh)

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

Trong cellForRowAtIndexPath, dequeue ô làm loại ô mới của bạn:

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

Rõ ràng là thay đổi các giá trị số để phù hợp với bố cục của bạn


1

Tôi đã tạo một tiện ích mở rộng bằng câu trả lời của @GermanAttanasio. Nó cung cấp một phương pháp để thay đổi kích thước hình ảnh thành kích thước mong muốn và một phương pháp khác để thực hiện điều tương tự trong khi thêm lề trong suốt cho hình ảnh (điều này có thể hữu ích cho các chế độ xem bảng mà bạn cũng muốn hình ảnh có lề).

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

Đây là phương pháp làm việc của @germanattanasio, được viết cho 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()
}

1

Nếu sử dụng, cell.imageView?.translatesAutoresizingMaskIntoConstraints = falsebạn có thể đặt các ràng buộc trên imageView. Đây là một ví dụ làm việc mà tôi đã sử dụng trong một dự án. Tôi đã tránh phân lớp và không cần tạo bảng phân cảnh với các ô nguyên mẫu nhưng tôi đã mất khá nhiều thời gian để chạy, vì vậy có lẽ tốt nhất chỉ nên sử dụng nếu không có cách nào đơn giản hơn hoặc ngắn gọn hơn cho bạn.

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

UITableViewCell thông thường hoạt động tốt để định vị mọi thứ nhưng cell.imageView dường như không hoạt động như bạn muốn. Tôi thấy rằng nó đủ đơn giản để khiến UITableViewCell bố trí đúng cách bằng cách trước tiên cung cấp cho cell.imageView một hình ảnh có kích thước phù hợp như

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

Sau đó, bạn có thể kết nối UIImageView hoạt động bình thường của riêng mình với

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

Đặt hình ảnh trên anImageView và nó sẽ thực hiện những gì bạn mong đợi một UIImageView làm. Có kích thước bạn muốn bất kể hình ảnh bạn cung cấp. Điều này sẽ đi trong tableView: cellForRowAtIndexPath:


0

Giải pháp này về cơ bản vẽ hình ảnh dưới dạng 'phù hợp với khía cạnh' trong trực tràng nhất định.

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

Tôi đã từng gặp vấn đề tương tự. Cảm ơn những người khác đã trả lời - Tôi đã có thể cùng nhau tìm ra giải pháp bằng cách sử dụng các phần của một số câu trả lời này.

Giải pháp của tôi là sử dụng swift 5

Vấn đề mà chúng tôi đang cố gắng giải quyết là chúng tôi có thể có hình ảnh với các tỷ lệ khung hình khác nhau trong TableViewCell s của chúng tôi nhưng chúng tôi muốn chúng hiển thị với độ rộng phù hợp. Tất nhiên, hình ảnh sẽ hiển thị không bị biến dạng và lấp đầy toàn bộ không gian. Trong trường hợp của tôi, tôi thấy ổn với một số "cắt xén" hình ảnh cao và gầy, vì vậy tôi đã sử dụng chế độ nội dung.scaleAspectFill

Để làm điều này, tôi đã tạo một lớp con tùy chỉnh của UITableViewCell. Trong trường hợp của tôi, tôi đã đặt tên cho nó StoryTableViewCell. Toàn bộ lớp học được dán bên dưới, với các nhận xét nội tuyến.

Cách tiếp cận này phù hợp với tôi khi sử dụng Chế độ xem Phụ kiện tùy chỉnh và các nhãn văn bản dài. Đây là hình ảnh của kết quả cuối cùng:

Chế độ xem bảng được kết xuất với chiều rộng hình ảnh nhất quán

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

Giải pháp mà chúng tôi đưa ra cũng tương tự như nhiều giải pháp khác. Nhưng để có được vị trí chính xác của dấu phân cách, chúng tôi phải đặt nó trước khi gọi super.layoutSubviews(). Ví dụ đơn giản:

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.