设置自定义UITableViewCells的高度

14 浏览
0 Comments

设置自定义UITableViewCells的高度

我正在使用一个自定义的UITableViewCell,其中包含一些要显示的标签、按钮和图像视图。单元格中有一个标签,其文本是一个NSString对象,字符串的长度可能是可变的。因此,我无法在UITableView的heightForCellAtIndex方法中为单元格设置一个固定的高度。单元格的高度取决于标签的高度,可以使用NSString的sizeWithFont方法确定。我尝试使用它,但似乎出错了。如何修复它?\n下面是用于初始化单元格的代码。\n如果 (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier])\n{\n self.selectionStyle = UITableViewCellSelectionStyleNone;\n UIImage *image = [UIImage imageNamed:@\"dot.png\"];\n imageView = [[UIImageView alloc] initWithImage:image];\n imageView.frame = CGRectMake(45.0,10.0,10,10);\n headingTxt = [[UILabel alloc] initWithFrame:CGRectMake(60.0,0.0,150.0,post_hdg_ht)];\n [headingTxt setContentMode: UIViewContentModeCenter];\n headingTxt.text = postData.user_f_name;\n headingTxt.font = [UIFont boldSystemFontOfSize:13];\n headingTxt.textAlignment = UITextAlignmentLeft;\n headingTxt.textColor = [UIColor blackColor];\n dateTxt = [[UILabel alloc] initWithFrame:CGRectMake(55.0,23.0,150.0,post_date_ht)];\n dateTxt.text = postData.created_dtm;\n dateTxt.font = [UIFont italicSystemFontOfSize:11];\n dateTxt.textAlignment = UITextAlignmentLeft;\n dateTxt.textColor = [UIColor grayColor];\n NSString * text1 = postData.post_body;\n NSLog(@\"text length = %d\",[text1 length]);\n CGRect bounds = [UIScreen mainScreen].bounds;\n CGFloat tableViewWidth;\n CGFloat width = 0;\n tableViewWidth = bounds.size.width/2;\n width = tableViewWidth - 40; //fudge factor\n CGSize textSize = {245.0, 20000.0f}; //文本区域的宽度和高度\n CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:11.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];\n CGFloat ht = MAX(size1.height, 28);\n textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];\n textView.text = postData.post_body;\n textView.font = [UIFont systemFontOfSize:11];\n textView.textAlignment = UITextAlignmentLeft;\n textView.textColor = [UIColor blackColor];\n textView.lineBreakMode = UILineBreakModeWordWrap;\n textView.numberOfLines = 3;\n textView.autoresizesSubviews = YES;\n [self.contentView addSubview:imageView];\n [self.contentView addSubview:textView];\n [self.contentView addSubview:webView];\n [self.contentView addSubview:dateTxt];\n [self.contentView addSubview:headingTxt];\n [self.contentView sizeToFit];\n [imageView release];\n [textView release];\n [webView release];\n [dateTxt release];\n [headingTxt release];\n}\n这是高度和宽度出错的标签:\ntextView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];

0
0 Comments

问题出现的原因是在自定义的UITableViewCell控制器中,没有设置UITableViewCell的高度,导致在UITableView中显示的时候高度不正确。解决方法是在UITableViewCell的控制器中的layoutSubviews方法中设置UITableViewCell的高度,再在UITableView的控制器中的tableView:heightForRowAtIndexPath方法中返回正确的高度。

具体的解决方法如下:

在自定义的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...
}

以上代码中,layoutSubviews方法用于在UITableViewCell加载子视图时设置UITableViewCell的高度,tableView:heightForRowAtIndexPath方法用于返回正确的UITableViewCell的高度。

通过以上的方法,可以解决设置自定义UITableViewCells的高度的问题。

0
0 Comments

问题的原因是:如果所有的行都具有相同的高度,可以直接设置UITableView的rowHeight属性,而不是实现heightForRowAtIndexPath方法。这样做的原因是,当显示一个table view时,它会调用每一行对应的delegate的tableView:heightForRowAtIndexPath方法,当table view有大量行(大约1000行或更多)时,这可能会导致性能问题。

解决方法是:直接设置tableView的rowHeight属性。这样做可以获得更好的性能,因为计算滚动条的维度等操作的时间复杂度是O(1),而不是O(n)。

需要注意的是,如果tableView的rowHeight属性已经被设置了,那么heightForRowAtIndexPath方法将不会被调用。

0
0 Comments

问题:如何设置自定义的UITableViewCells的高度?

原因:UITableViewDelegate没有实现tableView:heightForRowAtIndexPath:方法。

解决方法(Objective-C):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [indexPath row] * 20;
}

解决方法(Swift 5):

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

return indexPath.row * 20

}

解决方法补充说明:可以使用NSString的sizeWithFont:constrainedToSize:lineBreakMode:方法来计算行高,而不是简单地在indexPath上进行数学计算。

补充问题:如何在heightForRowAtIndexPath:中获取textView的高度以设置行高?

解决方法:可以使用sizeWithFont:constrainedToSize:lineBreakMode:方法来获取textView的高度。例如:

CGSize size = [textView.text sizeWithFont:textView.font constrainedToSize:CGSizeMake(textView.frame.size.width, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
CGFloat height = size.height;

补充问题解决方法说明:首先计算textView的文本在给定宽度下的高度,然后将其作为行高返回。

补充问题:为什么不能直接返回"[indexPath row] * (some-value)"作为行高?

解决方法:如果直接返回"[indexPath row] * (some-value)",则第一个单元格可能不可见,因为它的行号是零。为了确保所有单元格都可见,应该计算所需的单元格高度,并将计算的值作为行高返回。

0