设置自定义的UITableViewCells高度
我正在使用一个custome UITableViewCell有一些标签,button和图像显示。 单元格中有一个标签,其文本是NSString
对象,string的长度可以是可变的。 由于这个原因,我不能在UITableViews: heightForCellAtIndex
方法中为单元格设置一个不变的高度。 单元格的高度取决于可以使用NSStrings
sizeWithFont
方法确定的标签高度。 我尝试过使用它,但看起来我在某处出错了。 如何解决?
这里是用于初始化单元格的代码。
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) { self.selectionStyle = UITableViewCellSelectionStyleNone; UIImage *image = [UIImage imageNamed:@"dot.png"]; imageView = [[UIImageView alloc] initWithImage:image]; imageView.frame = CGRectMake(45.0,10.0,10,10); headingTxt = [[UILabel alloc] initWithFrame: CGRectMake(60.0,0.0,150.0,post_hdg_ht)]; [headingTxt setContentMode: UIViewContentModeCenter]; headingTxt.text = postData.user_f_name; headingTxt.font = [UIFont boldSystemFontOfSize:13]; headingTxt.textAlignment = UITextAlignmentLeft; headingTxt.textColor = [UIColor blackColor]; dateTxt = [[UILabel alloc] initWithFrame:CGRectMake(55.0,23.0,150.0,post_date_ht)]; dateTxt.text = postData.created_dtm; dateTxt.font = [UIFont italicSystemFontOfSize:11]; dateTxt.textAlignment = UITextAlignmentLeft; dateTxt.textColor = [UIColor grayColor]; NSString * text1 = postData.post_body; NSLog(@"text length = %d",[text1 length]); CGRect bounds = [UIScreen mainScreen].bounds; CGFloat tableViewWidth; CGFloat width = 0; tableViewWidth = bounds.size.width/2; width = tableViewWidth - 40; //fudge factor //CGSize textSize = {width, 20000.0f}; //width and height of text area CGSize textSize = {245.0, 20000.0f}; //width and height of text area CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:11.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap]; CGFloat ht = MAX(size1.height, 28); textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)]; textView.text = postData.post_body; textView.font = [UIFont systemFontOfSize:11]; textView.textAlignment = UITextAlignmentLeft; textView.textColor = [UIColor blackColor]; textView.lineBreakMode = UILineBreakModeWordWrap; textView.numberOfLines = 3; textView.autoresizesSubviews = YES; [self.contentView addSubview:imageView]; [self.contentView addSubview:textView]; [self.contentView addSubview:webView]; [self.contentView addSubview:dateTxt]; [self.contentView addSubview:headingTxt]; [self.contentView sizeToFit]; [imageView release]; [textView release]; [webView release]; [dateTxt release]; [headingTxt release]; }
textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
这是高度和宽度都出错的标签。
你的UITableViewDelegate
应该实现tableView:heightForRowAtIndexPath:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return [indexPath row] * 20; }
您可能会想要使用NSString
的sizeWithFont:constrainedToSize:lineBreakMode:
方法来计算您的行高度,而不是只是在indexPath上执行一些愚蠢的math:)
如果所有的行都是相同的高度,只需设置UITableView的rowHeight
属性而不是实现heightForRowAtIndexPath
。 Apple文档:
有使用tableView:heightForRowAtIndexPath:而不是rowHeight的性能影响。 每次显示表视图时,都会调用tableView:heightForRowAtIndexPath:在每个行的委托上,这可能会导致具有大量行(大约1000或更多)的表视图出现严重的性能问题。
在一个自定义的UITableViewCell控制器添加此
-(void)layoutSubviews { CGRect newCellSubViewsFrame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); CGRect newCellViewFrame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height); self.contentView.frame = self.contentView.bounds = self.backgroundView.frame = self.accessoryView.frame = newCellSubViewsFrame; self.frame = newCellViewFrame; [super layoutSubviews]; }
在UITableView控制器添加这个
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return [indexPath row] * 1.5; // your dynamic height... }
#define FONT_SIZE 14.0f #define CELL_CONTENT_WIDTH 300.0f #define CELL_CONTENT_MARGIN 10.0f - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { /// Here you can set also height according to your section and row if(indexPath.section==0 && indexPath.row==0) { text=@"pass here your dynamic data"; CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; CGFloat height = MAX(size.height, 44.0f); return height + (CELL_CONTENT_MARGIN * 2); } else { return 44; } } - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell; UILabel *label = nil; cell = [tv dequeueReusableCellWithIdentifier:@"Cell"]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"]; } ********Here you can set also height according to your section and row********* if(indexPath.section==0 && indexPath.row==0) { label = [[UILabel alloc] initWithFrame:CGRectZero]; [label setLineBreakMode:UILineBreakModeWordWrap]; [label setMinimumFontSize:FONT_SIZE]; [label setNumberOfLines:0]; label.backgroundColor=[UIColor clearColor]; [label setFont:[UIFont systemFontOfSize:FONT_SIZE]]; [label setTag:1]; // NSString *text1 =[NSString stringWithFormat:@"%@",text]; CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; if (!label) label = (UILabel*)[cell viewWithTag:1]; label.text=[NSString stringWithFormat:@"%@",text]; [label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))]; [cell.contentView addSubview:label]; } return cell; }
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { CGSize constraintSize = {245.0, 20000} CGSize neededSize = [ yourText sizeWithFont:[UIfont systemFontOfSize:14.0f] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeCharacterWrap] if ( neededSize.height <= 18) return 45 else return neededSize.height + 45 //18 is the size of your text with the requested font (systemFontOfSize 14). if you change fonts you have a different number to use // 45 is what is required to have a nice cell as the neededSize.height is the "text"'s height only //not the cell. }
感谢这个主题的所有post,有一些真正有用的方法来调整UITableViewCell的rowHeight。
这里汇集了一些其他人的概念,这些概念在为iPhone和iPad构build时确实有帮助。 您也可以访问不同的部分,并根据不同的视图大小进行调整。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { int cellHeight = 0; if ([indexPath section] == 0) { cellHeight = 16; settingsTable.rowHeight = cellHeight; } else if ([indexPath section] == 1) { cellHeight = 20; settingsTable.rowHeight = cellHeight; } return cellHeight; } else { int cellHeight = 0; if ([indexPath section] == 0) { cellHeight = 24; settingsTable.rowHeight = cellHeight; } else if ([indexPath section] == 1) { cellHeight = 40; settingsTable.rowHeight = cellHeight; } return cellHeight; } return 0; }
我看到很多解决scheme,但都是错误的或不完整的。 你可以用viewDidLoad和autolayout中的5行来解决所有的问题。 这对于客观的C:
_tableView.delegate = self; _tableView.dataSource = self; self.tableView.estimatedRowHeight = 80;//the estimatedRowHeight but if is more this autoincremented with autolayout self.tableView.rowHeight = UITableViewAutomaticDimension; [self.tableView setNeedsLayout]; [self.tableView layoutIfNeeded]; self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0) ;
对于迅捷2.0:
self.tableView.estimatedRowHeight = 80 self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.setNeedsLayout() self.tableView.layoutIfNeeded() self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0)
现在使用xib或在Storyboard中的tableview中创build你的单元使用这个,你不需要实现任何更多或覆盖。 (不要忘记号码行0)和底部标签(约束)降级“内容拥抱优先 – 垂直到250”
您可以在下一个url中下载代码: https : //github.com/jposes22/exampleTableCellCustomHeight
参考文献: http : //candycode.io/automatically-resizing-uitableviewcells-with-dynamic-text-height-using-auto-layout/
为了让dynamic单元高度作为Label的文本增加,首先需要计算高度,文本将在-heightForRowAtIndexPath
委托方法中使用,并返回其他标签的高度,图像(文本的最大高度+高度其他静态组件),并在创build单元时使用相同的高度。
#define FONT_SIZE 14.0f #define CELL_CONTENT_WIDTH 300.0f #define CELL_CONTENT_MARGIN 10.0f - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { if (indexPath.row == 2) { // the cell you want to be dynamic NSString *text = dynamic text for your label; CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; CGFloat height = MAX(size.height, 44.0f); return height + (CELL_CONTENT_MARGIN * 2); } else { return 44; // return normal cell height } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UILabel *label; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] ; } label = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, 280, 34)]; [label setNumberOfLines:2]; label.backgroundColor = [UIColor clearColor]; [label setFont:[UIFont systemFontOfSize:FONT_SIZE]]; label.adjustsFontSizeToFitWidth = NO; [[cell contentView] addSubview:label]; NSString *text = dynamic text fro your label; [label setText:text]; if (indexPath.row == 2) {// the cell which needs to be dynamic [label setNumberOfLines:0]; CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; [label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))]; } return cell; }