Iphone 如何为分组的UITableView可靠地子类化UITableViewCell?
在编写Iphone 如何为分组的UITableView可靠地子类化UITableViewCell?,iphone,uitableview,subclass,Iphone,Uitableview,Subclass,在编写UITableViewCell的自定义子类时,我发现结果适用于普通样式的UITableView的矩形单元格,但不适用于分组样式表中的圆形单元格 是否有一种方法可以可靠地将UITableViewCell子类化,以绘制适用于分组样式表的单元格?(不使用界面生成器。)您遇到了什么问题?在drawRect中,您将获得一个rect,并知道您的总大小-只需符合该空间即可。如果您使用的是LayoutSubview,同样的问题。我也注意到了这个问题。我的解决方法是将我的表格单元格缩小(宽度从320变为30
UITableViewCell
的自定义子类时,我发现结果适用于普通样式的UITableView
的矩形单元格,但不适用于分组样式表中的圆形单元格
是否有一种方法可以可靠地将
UITableViewCell
子类化,以绘制适用于分组样式表的单元格?(不使用界面生成器。)您遇到了什么问题?在drawRect中,您将获得一个rect,并知道您的总大小-只需符合该空间即可。如果您使用的是LayoutSubview,同样的问题。我也注意到了这个问题。我的解决方法是将我的表格单元格缩小(宽度从320变为300)。这不是一个很好的解决方案,但效果很好
我不相信在“分组”模式下,您可以单独删除表视图插入。不过我可能错了 我以前对
UITableViewCell
子类有很多问题,但后来我停止了子类化。
将子视图添加到UITableViewCell
的contentView
属性中,似乎在我遇到的任何实例中都可以完成相同的任务,因此我只需在我的UITableViewController
中执行此操作
下面是一个有标题和值的示例:
- (UITableViewCell *)tableView:(UITableView*)tableView
cellForRowAtIndexPath: (NSIndexPath*)indexPath
{
static NSString* CellIdentifier = @"AccountDetailsCell";
UILabel* mainLabel = nil;
UILabel* valueLabel = nil;
const CGFloat kAccountDetailFontSize = 14.0;
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
if ( cell == nil )
{
cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault
reuseIdentifier: CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake( 10.0, 0.0, 150.0, 44.0 )] autorelease];
mainLabel.tag = MAINLABEL_TAG;
mainLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize];
mainLabel.textAlignment = UITextAlignmentLeft;
mainLabel.textColor = [UIColor darkGrayColor];
mainLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;
mainLabel.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview: mainLabel];
valueLabel = [[[UILabel alloc] initWithFrame: CGRectMake( 150.0, 0.0, 150.0, 44.0 )] autorelease];
valueLabel.tag = VALUELABEL_TAG;
valueLabel.font = [UIFont boldSystemFontOfSize: kAccountDetailFontSize];
valueLabel.textAlignment = UITextAlignmentRight;
valueLabel.textColor = [UIColor darkTextColor];
valueLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
valueLabel.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview: valueLabel];
}
else
{
mainLabel = (UILabel*)[cell.contentView viewWithTag: MAINLABEL_TAG];
valueLabel = (UILabel*)[cell.contentView viewWithTag: VALUELABEL_TAG];
}
mainLabel.text = (NSString*)kCellTitles[indexPath.section][indexPath.row];
valueLabel.text = [self tableView: tableView valueLabelTextForRowAtIndexPath: indexPath];
return cell;
}
答案是否可以像第一次在
UITableViewCell
子类的layoutSubviews
方法中调用[super layoutSubviews]
那样简单
这是我的密码
首先,我创建UITextField
,并将其添加到initWithStyle:
方法中的contentView
:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
inputField = [[UITextField alloc] initWithFrame:CGRectZero];
[self.contentView addSubview:inputField];
inputField.borderStyle = UITextBorderStyleLine;
[inputField release];
}
return self;
}
然后在LayoutSubview中,我得到了以下内容:
-(void)layoutSubviews
{
inputField.frame = CGRectMake(5, 5, 100, 20);
}
使用该代码,文本字段是屏幕左侧的5px,当然,在分组模式下,文本字段是表格单元格左侧的5px。换句话说,在表视图单元格之外。不好
使用此代码,inputField
位于单元格右侧5px处,如我所愿:
-(void)layoutSubviews
{
[super layoutSubviews]; // the magic line
inputField.frame = CGRectMake(5, 5, 100, 20);
}
不过,我可能完全误解了你的问题
Erik问题在于,分组模式下的UITableView会切断部分单元格(侧面,以显示背景,并且它还会环绕部分顶部和底部单元格的角)。经过进一步的测试,在drawRect中,表视图单元格没有以正确的大小通过,这是正确的。另一种方法是为标准UITableViewCell设置自定义背景视图,并在那里绘制所有图形。你得到了一个宽度合适的单元格,但你必须自己正确绘制圆角的上下角。我发现这种方法不足以满足我的需要。我有一个单元格,它有多行标题和多行描述,并根据两个标签中包含的文本自动调整大小。我正在-(void)layoutSubviews中调整大小,并记住先调用[super layoutSubviews],但在我看来,self.contentView直到调用之后才调整大小,因此有时我的单元格的高度会出错。这种方法很好,但如果您想使用QuartzCore(如阴影)作为标签,则滚动会很慢,你必须自己画单元格。我对子类很满意,因为我的很多问题都在最近的SDK中得到了纠正。我当前的方法涉及一个带有
configureWithDataObject:(id)dataObject
方法的子类,然后我为我的自定义单元格创建子类。My view controller自动选择正确的单元格子类并调用configureWithDataObject:
。使开发变得快速和简单(尽管在技术上比在静态代码中进行开发效率要低)。我怎么会错过这一点?!!非常感谢你的魔术线!