使用故事板,我为我的表格视图创建了一个自定义单元格,并且还为我的所有属性创建了一个自定义类别。动态表格单元格高度
现在,将单元格高度变为动态的最佳方式是什么?最好的方法是在哪里进行? 我应该在单元格的自定义类中执行此操作吗?或者在我的表格视图控制器?
我想在自定义类中这样做会更有意义,但是我应该怎么做? 一旦一个特定的标签填充,它应该改变细胞的高度
使用故事板,我为我的表格视图创建了一个自定义单元格,并且还为我的所有属性创建了一个自定义类别。动态表格单元格高度
现在,将单元格高度变为动态的最佳方式是什么?最好的方法是在哪里进行? 我应该在单元格的自定义类中执行此操作吗?或者在我的表格视图控制器?
我想在自定义类中这样做会更有意义,但是我应该怎么做? 一旦一个特定的标签填充,它应该改变细胞的高度
您不能从自定义绘图类中更改单元格的高度。
您可以在仅具有UITableView的viewController中执行此操作。 通过指定所有单元的硬编码的行高度,或通过使用
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
并指定这里的细胞的高度。 如果要为单元格设置不同的高度,则应检查indexpath.row属性并返回所需的高度值。
如果你想改变的屏幕细胞已经绘制的高度,你将不得不重新加载细胞以此来反映这种变化:
设置你的视图控制器是表视图的委托,然后实现在视图控制器下面的UITableViewDelegate方法:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
从我所看到的是,这将使用我的故事板给,我用[cell.descriptionLabel sizeToFit]高度,但它似乎没有使用这个新的高度 –
使用下面的代码
-(CGFloat)heightForText:(NSString *)str width:(int)width font:(UIFont *)font lineBreakMode:(NSLineBreakMode) lineBreakMode
{
CGSize textSize;
textSize = [str boundingRectWithSize:CGSizeMake(width, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : font} context:nil].size;
return textSize.height;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(tableView == self.yourTable)
{
NSMutableDictionary *dict = [self.yourArray objectAtIndex:indexPath.row] ;
return [self heightForText:[dict valueForKey:@"reviewDescription"] width:300 font:[UIFont fontWithName:kAppRegularFont size:15.0] lineBreakMode:0]+75;
}
return 70;
}
添加这些行到你的 “viewDidLoad中” 方法
self.tableView.estimatedRowHeight = your height here
self.tableView.rowHeight = UITableViewAutomaticDimension;
不要设置默认HIGHT到委托
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
}
你应该使用代码语法来格式化你的文章! (canoot编辑,队列已满):/ – MTroy
谢谢,我似乎可以手动设置高度,但是何时调用这个函数?我有几个标签,并且高度应该相应地改变,当我输出其中一个标签的文本时,它看起来是空的 –
如果更改可见单元格的高度,则需要重新加载行以实际强制UITableView调用委托cellForRowAtIndexPath为每个可见单元格,这意味着基本上它会重绘可见单元格。所以你应该相应地调整你的标签高度。如果您正在使用自定义绘制代码,请记住您必须调用setNeedsDisplay方法来强制您的自定义绘制类的drawRect重新加载。 – Lefteris
我设法让它与reloadRowsAtIndexPath一起工作,谢谢! –