在我的情况下,我使用了自己的子类继承自
UITableViewCell
。
这非常干净且易于使用。
此外,我可以使用不同大小的图像来调整此单元格的大小。
关键是使用其他属性来替换常规的
imageView
1:在子类中,我添加了一个属性
mainImageView
,可以代替
imageView
。
@property (nonatomic, retain) UIImageView *mainImageView;
2: 然后在 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
中。
我分配并初始化了 mainImageView
。
您可以为 mainImageView
设置任何框架(rect)。
将其作为子视图添加到 contentView
中。
我使用 insetImageView
将其与 `contentView' 的垂直中心对齐。
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
mainImageView = [[UIImageView alloc] initWithFrame:frameCellMainImageView];
[self.contentView addSubview:mainImageView];
insetImageView = (sizeRowHeightTwoLinedDetail - frameCellMainImageView.size.height) / 2.0;
}
return self;
}
3: 重写 - (void)layoutSubviews
方法,确保其他属性如 textLabel
、detailTextLabel
根据添加的属性 mainImageView
来设置它们的框架位置。
- (void)layoutSubviews {
[super layoutSubviews];
CGRect frameImageView = frameCellMainImageView;
frameImageView.origin.x = insetImageView;
frameImageView.origin.y = insetImageView;
[self.mainImageView setFrame:frameImageView];
frameImageView = self.mainImageView.frame;
CGFloat newLeftInset = frameImageView.size.width + insetImageView;
CGRect frameTextLabel = self.textLabel.frame;
CGRect frameDetailLabel = self.detailTextLabel.frame;
frameTextLabel.origin.x += newLeftInset;
frameDetailLabel.origin.x += newLeftInset;
CGFloat newTextWidth = 320.0;
newTextWidth -= newLeftInset;
newTextWidth -= insetImageView;
newTextWidth -= insetImageView;
frameTextLabel.size.width = newTextWidth;
frameDetailLabel.size.width = newTextWidth;
[self.textLabel setFrame:frameTextLabel];
[self.detailTextLabel setFrame:frameDetailLabel];
}
4:在使用此单元格作为UITableDataSourceDelegate
方法时,请使用cell.mainImageView
接收消息,而不是常规的cell.imageView