2

我是 iOS 编程新手,这就是为什么我正在寻找最有效的解决方案来解决我的问题。我想要实现的是显示UITableViewCell一个名称(一些文本),并在每个名称下显示一些带有数字的填充小矩形,类似于徽章。

我的第一个想法是创建一个UIView代表徽章的,并在自定义UITableViewCell中将这些矩形添加为subviews. 第二个想法是只创建一个UIView将绘制所有小矩形的。

我的问题是,哪个是性能更好的解决方案,知道:

  • 单元格的数量将是最大的。20个,矩形总数不超过50个
  • 一个单元格中显示的矩形数量不同
  • 我想重用单元格,所以我必须更新/重绘每一行的单元格内容
  • 我想避免“隐藏”子视图的单元格选择视图问题

当然,任何其他解决方案都会受到赞赏。

提前致谢,hxx

4

5 回答 5

0

我想到了2种方法。

  1. 您可以将组件作为子视图放入内部UITableViewCell(通过 XIB 或编程子类化UITableViewCell)并在UITableView.

  2. 您可以子类UITableViewCell化并覆盖该-(void)drawRect方法并绘制您希望在单元格上显示的所有组件。

于 2013-06-20T07:52:30.860 回答
0

看看能不能帮忙。您可以创建一个新类扩展至 UITableViewCell,这意味着将 UITableViewCell 重写为您自己的单元格,命名为 MyTestCell。在这个单元格中,您调用创建您的属性,如标签和视图,并将它们添加到您的新单元格中。喜欢将其添加到 MyTestCell.h

@property (nonatomic, retain) UILable *myLable1;
@property (nonatomic, retain) UIView *mySubview1;

MyTestCell.m
_myLable1 = .....
_mySubview = .....

[self addSubview: _myLbale1];
[self addSubview: _mySubview1];


And when use, u can work like this

static NSString *CellIdentifier = @"MyCell";
MyTableViewCell *cell = [tableview dequeReuseID:CellIdentifier]; 
if (cell == nil) {
  cell = [MyTableViewCell alloc] init.........
} 

//And you can sign your property here in your cell
cell.myLable1 = ....
cell.myView1 = .....

return cell;

}

如果您添加到标签的字符串不同,请使标签.高度不同。你可以使用这样的代码

 CGSize labelSize = [str sizeWithFont:[UIFont boldSystemFontOfSize:17.0f]
                   constrainedToSize:CGSizeMake(280, 100)
                   lineBreakMode:UILineBreakModeCharacterWrap];   //check your lableSize
 UILabel *patternLabel = [[UILabel alloc] initWithFrame:CGRectMake(35, 157, labelSize.width, labelSize.height)];   
 patternLabel.text = str;
 patternLabel.backgroundColor = [UIColor clearColor];
 patternLabel.font = [UIFont boldSystemFontOfSize:17.0f];
 patternLabel.numberOfLines = 0;// must have
 patternLabel.lineBreakMode = UILineBreakModeCharacterWrap;// must have

将此添加到您的单元格中,并使其动态调整您的标签以及您的单元格的大小!而且您还必须为您的 tableView 行高动态设置高。(知道什么是动态调整大小吗?)请参阅:rewrite the method setMyLable1 in MyTableViewCell.m

 -(void)setMyLable1:(UILable*)aLable
 {
   //in here when never your sign your alabel to your cell (like this : cell.myLable1) this method will be call and u can get the size of your string and set this label's height
   //get string size  StringSzie

   [_myLable1 setFrame:CGRectMake(10,10,stringSize.width,stringSize.height)];

   //And resize your cell as well
   [self setFrame:CGRectMake(0,0,_myLable1.frame.size.width+20,_myLable1.frame.size.height+20)];

   //done!!!

 } 

好的,您会为自己获得一个自动重新调整的单元格,并且您也必须在 tableView 中为您的行动态重置高度!!!!!!

于 2013-06-20T09:25:51.913 回答
0

为什么不在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath这里创建单元格,您可以定义自定义类型的单元格,该单元格也将重用,并且只要您愿意,您可以像这样将不同的东西添加到单元格中。

static NSString *CellIdentifier = @"Cell";
UILabel *RequestSentTo;
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
    cell.selectionStyle=UITableViewCellSelectionStyleNone;
    RequestSentTo = [[UILabel alloc] initWithFrame:CGRectMake(11, 2, 286, 40)];
    RequestSentTo.backgroundColor = [UIColor clearColor];
    RequestSentTo.tag = 200;
    RequestSentTo.numberOfLines = 3;
    RequestSentTo.font=[UIFont boldSystemFontOfSize:15.0];
    RequestSentTo.textColor = [UIColor blackColor];
    RequestSentTo.lineBreakMode=UILineBreakModeWordWrap;
    [cell.contentView addSubview:RequestSentTo];
} else {
    RequestSentTo=(UILabel*)[cell.contentView viewWithTag:200];
}
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"Shift Request for "];
[string appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ by ",dateStr] attributes:nil]];
[string appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"Dr. %@",notificationsObj.doctorName] attributes:purpleTextAttributes]];//purpl
RequestSentTo.attributedText=string;
RequestSentTo.lineBreakMode=UILineBreakModeWordWrap;
RequestSentTo.numberOfLines = 3;

任何时候你都可以通过重用单元添加你想要的东西。希望这可以帮助

于 2013-06-20T07:07:43.423 回答
0

你需要什么叫做自定义单元格

这是很好的教程

为 uitableview 自定义表格视图单元格

于 2013-06-20T07:09:09.667 回答
0

我的建议是将 UITableViewCell 子类化并在其中进行您需要的自定义。自定义视图可以在其下方有一个标签和矩形。

矩形可以是带有背景图像的小型自定义按钮(如果有或给它一个背景颜色)和标题作为你的数字。你必须,但是根据你的桌子的宽度计算它们的宽度以适应最大数量矩形。

您可以禁用 xib 中的表格选择,或者您可以像这样以编程方式执行它cell.selectionStyle = UITableViewCellSelectionStyleNone;并且不实现didSelectRowAtIndexPath

我已经按照为我的表格子类化单元格的方法来自定义它们的外观和感觉并且效果很好。我希望这会有所帮助。

可以在此处找到从子类化开始的好教程

http://howtomakeiphoneapps.com/how-to-design-a-custom-uitableviewcell-from-scratch/1292/

于 2013-06-20T07:11:35.590 回答