如何使UITableView的高度dynamic与自动布局function?

我在Xcode 5中使用自动布局。

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

但尺寸总是200px。 如果内容比这个大,我应该向下滚动查看下面的行。

我应该怎么做给予tableviewdynamic大小? 在这里输入图像说明

这是用最新版本的Xcode进行testing的。

1)在Xcode转到故事板,并点击你的表视图来select它。

2)在“实用程序”窗格中(请参见图1),确保已定义表视图高度的约束。

表视图heigth约束

3)在显示表视图的视图控制器中创build这个约束的出口:

在Swift 3

@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint! 

在目标C中

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

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

出口后的表格视图heigth约束

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.下载并用Xcodetesting。 这两个项目都使用最新版本的Xcode,Xcode 8.3.2。

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

用xib或storyboard创build你的单元格。 给出它的内容。 现在在CellForRowAtIndexPath中调用它。 例如。 如果你想根据评论的标签文本设置单元格高度。 在这里输入图像说明

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

然后在ViewDidLoad中

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

现在

 -(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return UITableViewAutomaticDimension;} 

瞧…………你做到了。

它可以通过编程来完成。 这个概念(和代码本身)其实很简单:

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

针对iOS 7的Xcode 6进行testing。

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

….

 @IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint? 

….

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