在具有动态单元格高度的UITableview中的自动布局

8 浏览
0 Comments

在具有动态单元格高度的UITableview中的自动布局

为了实现我的表格视图单元格的动态高度,我参考了这个链接。

在UITableView中使用自动布局进行动态单元格布局和可变行高

这是带有所有约束的自定义单元格

这是我的表格视图数据源和代理方法的代码:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
  {
       return arrTemp.count;
  }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier=@"AutoLAyoutCell";
AutoLayoutTableViewCell *cell=(AutoLayoutTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell==nil) {
    for (id currentObject in [[NSBundle mainBundle] loadNibNamed:@"AutoLayoutTableViewCell" owner:self options:nil]) {
        if ([currentObject isKindOfClass:[UITableViewCell class]]) {
            cell = (AutoLayoutTableViewCell *)currentObject;
            break;
        }
    }
}
cell.IBlblLineNo.text=[NSString stringWithFormat:@"Line:%i",indexPath.row];
cell.IBlblLineText.text=[arrTemp objectAtIndex:indexPath.row];
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
CGSize expectedlineLabelSize = [cell.IBlblLineText.text sizeWithFont:cell.IBlblLineText.font constrainedToSize:CGSizeMake(280, 1000) lineBreakMode:NSLineBreakByTruncatingTail];
cell.IBlblLineText.numberOfLines=expectedlineLabelSize.height/17;
CGRect frmlbl=cell.IBlblLineText.frame;
frmlbl.size.height=expectedlineLabelSize.height;
cell.IBlblLineText.frame=frmlbl;
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
AutoLayoutTableViewCell *cell = (AutoLayoutTableViewCell *)[IBtblAutoLayoutExample cellForRowAtIndexPath:indexPath];
cell.IBlblLineNo.text=[NSString stringWithFormat:@"Line:%i",indexPath.row];
cell.IBlblLineText.text=[arrTemp objectAtIndex:indexPath.row];
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
CGSize expectedlineLabelSize = [cell.lineLabel.text sizeWithFont:cell.lineLabel.font constrainedToSize:CGSizeMake(280, 1000) lineBreakMode:NSLineBreakByWordWrapping];
 cell.IBlblLineText.numberOfLines=expectedlineLabelSize.height/17;
CGRect frmlbl=cell.IBlblLineText.frame;
frmlbl.size.height=expectedlineLabelSize.height;
cell.IBlblLineText.frame=frmlbl;
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
height += 1.0f;
return height;
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
     AutoLayoutTableViewCell *cell = (AutoLayoutTableViewCell *)[IBtblAutoLayoutExample cellForRowAtIndexPath:indexPath];
 CGSize expectedlineLabelSize = [cell.IBlblLineText.text sizeWithFont:cell.IBlblLineText.font constrainedToSize:CGSizeMake(280, 1000) lineBreakMode:NSLineBreakByTruncatingTail];
 return expectedlineLabelSize.height;
}

我有两个问题:

  1. 我的问题是在heightForRowAtIndexPathestimatedHeightForRowAtIndexPath的代码中,我得到了EXE_BAD_EXCESS错误,它出现在以下这行代码附近:AutoLayoutTableViewCell *cell = (AutoLayoutTableViewCell *)[IBtblAutoLayoutExample cellForRowAtIndexPath:indexPath];
  2. 为什么我需要在cellForRowAtIndexPathheightForRowAtIndexPath中都写入标签文本?

此外,我是否漏掉了实现动态单元格高度所需的任何内容?

0
0 Comments

在UITableView中使用AutoLayout实现动态单元格高度的问题是常见的。出现这个问题的原因是因为在设置自动维度的行高和估计行高时,需要遵循以下步骤:

1. 分配并实现tableView的dataSource和delegate。

2. 将rowHeight和estimatedRowHeight属性设置为UITableViewAutomaticDimension。

3. 实现delegate/dataSource方法(例如heightForRowAt方法),并返回UITableViewAutomaticDimension。

以下是在Objective-C和Swift中实现的示例代码:

Objective-C:

// 在ViewController.h中
#import 
@interface ViewController : UIViewController 
@property (nonatomic, weak) IBOutlet UITableView *table;
@end
// 在ViewController.m中
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.table.dataSource = self;
    self.table.delegate = self;
    self.table.rowHeight = UITableViewAutomaticDimension;
    self.table.estimatedRowHeight = UITableViewAutomaticDimension;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}
@end

Swift:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {

super.viewDidLoad()

// 设置tableView的dataSource和delegate

table.dataSource = self

table.delegate = self

// 设置自动维度的行高

table.rowHeight = UITableView.automaticDimension

table.estimatedRowHeight = UITableView.automaticDimension

}

// UITableViewAutomaticDimension会根据标签内容/文本计算高度

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

return UITableView.automaticDimension

}

}

对于单元格中的UILabel实例,需要进行以下设置:

1. 将numberOfLines属性设置为0,并将lineBreakMode属性设置为truncate tail。

2. 根据其父视图/单元格容器设置所有约束(顶部、底部、左侧、右侧)。

3. (可选)如果希望即使没有数据,标签也占据最小的垂直区域,请为标签设置最小高度。

注意:如果有多个具有动态长度的标签(UI元素),并且希望根据其内容大小调整它们:请调整标签的“Content Hugging and Compression Resistance Priority”,以便希望以较高优先级进行扩展/压缩的标签具有更高的优先级。

通过以上步骤和示例代码,可以实现在UITableView中使用AutoLayout实现动态单元格高度的效果。

0