我正在尝试让我的表格视图单元格根据单元格内的内容调整高度。
由于单元格具有不同的高度,它似乎正在工作,但我无法正确显示文本。
使用storyboard创建表格视图和原型单元格,并且我有一个链接到我的原型单元格的自定义单元格类。在我的原型单元格中,我有三个标签;标题标签,日期标签和具有动态文本数据的标签。动态文本数据标签行号设置为0,并且在故事板的属性检查器中将换行符设置为“自动换行”。
当我运行应用程序时,单元格高度都不同,所以我假设索引路径的行高度有效:
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Text data
NSDictionary *cellOutputDict = [newsDataArray objectAtIndex:indexPath.row];
NSString *text = [NSString stringWithFormat:@"%@", [cellOutputDict objectForKey:@"text"]];
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:nil];
CGFloat width = 280;
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;
return size.height + 2 * 20; // size.height plus 2 times the desired margin
}
这是我在索引路径行的单元格:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"NewsCell";
NewsCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// If the cell doesn't exists create it
if (cell == nil) {
cell = [[NewsCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
// Configure the cell...
// Text data
NSDictionary *cellOutputDict = [newsDataArray objectAtIndex:indexPath.row];
cell.titleLabel.text = [NSString stringWithFormat:@"%@", [cellOutputDict objectForKey:@"title"]];
cell.dateLabel.text = [NSString stringWithFormat:@"%@", [cellOutputDict objectForKey:@"date"]];
cell.newsTextLabel.text = [NSString stringWithFormat:@"%@", [cellOutputDict objectForKey:@"text"]];
return cell;
}
打印出动态文本数据的cell.newsTextLabel.text显示在单元格中,但只显示在第一行。
我已经尝试了一些显示iOS 6.1的动态单元格高度的示例,它们工作正常,但我无法在iOS 7 +上运行
所以我希望有人可以帮助我,帮助我弄清楚我做错了什么。
答案 0 :(得分:2)
要使标签与单元格一起展开,您应该为其提供约束,将其绑定到上方和下方的视图 - 在您看起来像是对单元格底部的约束,以及对标签的一个约束(带有"标题......")在它之上。
答案 1 :(得分:1)
试试这个
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
float height = cell.frame.size.height;
return height;
}
答案 2 :(得分:1)
设置行高的自动尺寸&估计行高,确保执行以下步骤,自动尺寸对单元格/行高度布局有效。
UITableViewAutomaticDimension
分配给rowHeight& estimatedRowHeight heightForRowAt
并向其返回值UITableViewAutomaticDimension
)-
目标C:
// in ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property IBOutlet UITableView * table;
@end
// in ViewController.m
- (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;
}
<强>夫特:强>
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Don't forget to set dataSource and delegate for table
table.dataSource = self
table.delegate = self
// Set automatic dimensions for row height
// Swift 4.2 onwards
table.rowHeight = UITableView.automaticDimension
table.estimatedRowHeight = UITableView.automaticDimension
// Swift 4.1 and below
table.rowHeight = UITableViewAutomaticDimension
table.estimatedRowHeight = UITableViewAutomaticDimension
}
// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// Swift 4.2 onwards
return UITableView.automaticDimension
// Swift 4.1 and below
return UITableViewAutomaticDimension
}
用于UITableviewCell中的标签实例
注意:如果您有多个动态长度的标签(UIElements),应根据其内容大小进行调整:调整内容拥抱和压缩阻力优先级`对于要以更高优先级扩展/压缩的标签。
答案 3 :(得分:0)
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByClipping;