如何使用autolayout功能使UITableView的高度动态化?

时间:2013-08-28 21:00:58

标签: ios uitableview autolayout

我在Xcode 5中使用autolayout。

我将表格视图的高度设置为大于或等于200px。我希望它具有动态大小。因为有时它会有很多行,有时它会有几行。

但是大小总是200px。如果内容大于那个,我应该向下滚动以查看较低的行。

如何为tableview提供动态大小?enter image description here

5 个答案:

答案 0 :(得分:65)

使用最新版本的Xcode测试。

1)在Xcode中,转到故事板并单击表格视图以选择它。

2)在“工具”窗格(参见图1)中,确保定义了表视图高度的约束。

Table view heigth constraint

3)在显示表视图的视图控制器中,创建此约束的出口:

在Swift 3中

@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint!

目标C

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *dynamicTVHeight;

4)在故事板中,返回UITableView的高度约束,并确认右侧的图标已将颜色从紫色更改为蓝色(参见图2)

Table view heigth constraint after outlet

4)同样将此代码放在同一个视图控制器中:

夫特

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}


override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let height = min(self.view.bounds.size.height, tableView.contentSize.height)
    dynamicTVHeight.constant = height
    self.view.layoutIfNeeded()
}

目标C

- (void)viewWillAppear:(BOOL)animated
{
    // just add this line to the end of this method or create it if it does not exist
    [self.tableView reloadData]; 
}

-(void)viewDidLayoutSubviews
{
    CGFloat height = MIN(self.view.bounds.size.height, self.tableView.contentSize.height);
    self.dynamicTVHeight.constant = height;
    [self.view layoutIfNeeded];
}

这可以解决您的问题。

这些是示例项目的两个版本的链接,它们可以满足您的需求,一个用于Objective C,另一个用于Swift 3.下载并使用Xcode进行测试。这两个项目都使用最新版本的Xcode,Xcode 8.3.2。

https://github.com/jcatalan007/TestTableviewAutolayout https://github.com/jcatalan007/TestTableviewAutolayoutSwift

答案 1 :(得分:4)

通过xib或storyboard创建您的单元格。给出它的出口内容。现在在CellForRowAtIndexPath中调用它。例如。如果要根据Comment的标签文本设置单元格高度。enter image description here

所以设置你的commentsLbl.numberOfLine = 0;

然后在ViewDidLoad

 self.table.estimatedRowHeight = 44.0 ;
self.table.rowHeight = UITableViewAutomaticDimension;

现在

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;}
瞧瞧............你做到了....

答案 2 :(得分:2)

可以通过编程方式完成。概念(和代码本身)实际上非常简单:

在myTableView的superview的updateConstraints方法中,添加一个约束,使myTableView的高度等于myTableView.contentSize.height。

在针对iOS 7的Xcode 6上进行测试。

答案 3 :(得分:2)

您可以按Ctrl +将UITableView的高度约束拖动到视图控制器源代码中并为其命名。然后在ViewController的updateViewConstraints中,您可以将该约束的常量设置为tableView.contentSize.height

...

@IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint?

...

override func updateViewConstraints() {
    super.updateViewConstraints()
    tableViewHeightConstraint?.constant = tableView.contentSize.height
}

答案 4 :(得分:-1)

或者您可以满足情节提要中的高度限制并检查: [x]在构建时删除

enter image description here

然后,在您的控制器中,更新包含所有单元格内容的tableview的高度。 (*我使用PureLayout作为AutoLayout的框架)

enter image description here