所以UITableViewCell的问题是你无法控制内置对象的大小(即imageView、contentView、accessoryView、backgroundView)。当表格更改时,您的自定义设置会被践踏。
正如 Behlul 指出的那样,您可以通过使用layoutSubviews来强制尺寸正确,但问题是每次表格滚动时都会调用 layoutSubviews 。那是很多不必要的重新布局调用。
另一种方法是将所有内容添加到contentView。同样,如果您正在自定义背景,您可以创建一个透明的backgroundView并将您的自定义背景视图(例如myBackgroundView)添加为backgroundView的子视图。
通过这种方式,您可以根据需要放置和调整项目大小。
不利的一面是不再从附件或图像视图接收库存消息。你只需要创造你自己的。
希望有帮助!
// This code is not tested
// MyCustomTableViewCell
- (id) init{
self = [super initWithStyle: UITableViewCellStyleDefault reuseIdentifier:@"MyReuseIdentifier"];
if(self){
//image view
my_image_view = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"default_image.png"]] retain];
[my_image_view setFrame:CGRectMake(10,10,30,30)];
[self.contentView addSubview:my_image_view];
//labels
my_text_label = [[[UILabel alloc] initWithFrame:CGRectMake(50,10,100,15)] retain];
[self.contentView addSubview:my_text_label];
//set font, etc
//detail label
my_detail_label = [[[UILabel alloc] initWithFrame:CGRectMake(50,25,100,15)] retain];
[self.contentView addSubview:my_detail_label];
//set font, etc
//accessory view
//Whatever you want to do here
//attach "accessoryButtonTapped" selector to button action
//background view
UIView* background_view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)] autorelease];
[background_view setBackgroundColor:[UIColor greenColor]];
background_view.layer.cornerRadius = 17;
background_view.layer.borderWidth = 3;
background_view.layer.borderColor = [UIColor whiteColor].CGColor;
[self setBackgroundView:[[[UIView alloc] init] autorelease]];
[self.backgroundView addSubview:background_view];
}
return self;
}
- (void) setLabelText: (NSString*) label_text{
[my_text_label setText:label_text];
}
- (void) setDetailText: (NSString*) detail_text{
[my_detail_label setText: detail_text];
}
- (void) accessoryButtonTapped{
//call table view delegate's accessoryButtonTappedForRowWithIndexPath method
}