我正在尝试根据UILabel
的长度单独更改每个单元格的高度,但似乎没有改变。
我找到了以下问题:How to change cell height dynamically in UITableView static cell
我尝试了这个问题的解决方案:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
//return 110;
NewsFlashCustomCell *cell;
static NSString *CellIdentifier = @"CustomCell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
[cell layoutIfNeeded];
return cell.messageLabel.frame.origin.y + cell.messageLabel.frame.size.height;
}
然而,这似乎无能为力。
这是一个截图:
我喜欢含有"潮汐波的细胞的高度"和" mashup"小于最后2个单元格,因为它有更长的消息。
我无法执行indexPath.row
检查以单独更改每个单元格,因为每条消息都是从数据库中提取的,因此消息的长度会有所不同。
可以做些什么?
如果它有帮助,这里是我的约束的截图:
感谢。
更新:
我在viewDidLoad中添加了以下代码:
tableView.rowHeight = UITableViewAutomaticDimension;
这就是它的样子:
答案 0 :(得分:0)
请在viewDidLoad
中写下以下一行:
_tableView.rowHeight = UITableViewAutomaticDimension;
请确保以下几点:
heightForRowAtIndexPath
方法请告诉我结果
编辑:
在cellForRowAtIndexPath
方法
myLabel.preferredMaxLayoutWidth = cell.contentView.frame.size.width;
答案 1 :(得分:0)
如果无法使用其他方法设置,请根据单元格高度减小标签字体大小。
label.numberOfLines=0;
label.clipsToBounds=YES;
label.adjustsFontSizeToFitWidth=YES;
label.lineBreakMode = NSLineBreakByWordWrapping;
答案 2 :(得分:0)
您可以根据文本的长度计算标签的高度,并按照以下方式执行:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return [self calculateHeightForCellAtIndexPath:indexPath];
}
#pragma mark - cell height handling
-(CGFloat)calculateHeightForCellAtIndexPath:(NSIndexPath *)indexP{
UILabel *lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width-22, defaultHeightOfYourLabel)];
NSString *strLbl;
strLbl = [yourArray objectAtIndex:indexP.row];
lbl.text = strLbl;
if (IS_IPAD) {
[lbl setFont:fontRegular15];
}else{
[lbl setFont:fontRegular12];
}
UIFontDescriptor * fontDLBLTime = [lbl.font.fontDescriptor
fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
if (IS_IPAD) {
[lbl setFont:[UIFont fontWithDescriptor:fontDLBLTime size:15]];
}else{
[lbl setFont:[UIFont fontWithDescriptor:fontDLBLTime size:12]];
}
[lbl setLineBreakMode:NSLineBreakByClipping];
[lbl setNumberOfLines:0];
int noOfLines = [GlobalFunction lineCountForLabel:lbl];
CGFloat height = [GlobalFunction heightForWidth:lbl.frame.size.width usingFont:lbl.font forLabel:lbl];
if (noOfLines>1) {
return height + 33; //here 33 is sum of top and bottom space from view.
}
return 50; //default height of cell.
}
在你的班级中实现以下方法:
#define CGFLOAT_MAX_HEIGHT 2000.0
+ (int)lineCountForLabel:(UILabel *)label {
return ceil([self heightForWidth:label.frame.size.width usingFont:label.font forLabel:label] / label.font.lineHeight);
}
+(CGFloat)heightForWidth:(CGFloat)width usingFont:(UIFont *)font forLabel:(UILabel *)lbl{
NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGSize labelSize = (CGSize){width, CGFLOAT_MAX_HEIGHT};
CGRect r = [lbl.text boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:context];
return r.size.height;
}
您可以根据字体和标签大小自定义lbl
。
答案 3 :(得分:0)
让你的标签限制你的细胞边界,就像你已经做的那样。一定要在它周围加上填充物,使它看起来更好。
在heightForRowAtIndexPath:
计算标签所需的高度(重要的是,您的标签已正确配置为多行和/或自动换行)
计算标签所需的高度
CGRect frame = [label.text boundingRectWithSize:CGSizeMake(cell.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:nil];
返回计算出的高度加上填充
frame.size.height + TopPadding + Bottom Padding
这是一个动态调整大小单元的一般方法。
注意:有时这会偏离几个点,因此您可能需要在单元格高度中添加5个额外点以使所有文本适合标签。