Ios 如何使用自动布局功能使UITableView的高度动态化?

Ios 如何使用自动布局功能使UITableView的高度动态化?,ios,uitableview,autolayout,Ios,Uitableview,Autolayout,我在Xcode 5中使用自动布局 我将表格视图的高度设置为大于或等于200px。我希望它有动态大小。因为有时候会有很多行,有时候会有几行 但是大小总是200px。如果内容比这个大,我应该向下滚动查看下面的行 我应该做些什么来提供tableview动态大小?这是用最新版本的Xcode测试的 1在Xcode中,转到情节提要并单击表视图以选择它 2在实用程序窗格中,请参见图1,确保定义了表格视图高度的约束 3在显示表格视图的视图控制器中,创建此约束的出口: 斯威夫特3 @IBOutlet weak v

我在Xcode 5中使用自动布局

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

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


我应该做些什么来提供tableview动态大小?

这是用最新版本的Xcode测试的

1在Xcode中,转到情节提要并单击表视图以选择它

2在实用程序窗格中,请参见图1,确保定义了表格视图高度的约束

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

斯威夫特3

@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint!
在目标C中

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *dynamicTVHeight;
- (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];
}
4在情节提要中,返回UITableView的高度约束,并验证右侧的图标是否已将颜色从紫色更改为蓝色参见图2

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

迅捷的

目标C

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *dynamicTVHeight;
- (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];
}
这应该能解决你的问题

这些链接指向示例项目的两个版本,一个用于目标C,另一个用于Swift 3。下载它并用Xcode测试它。这两个项目都使用最新版本的Xcode,即Xcode 8.3.2


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

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


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

通过xib或故事板创建您的单元。给它的出口的内容。现在在CellForRowatineXpath中调用它。如果您想根据注释的标签文本设置单元格高度

因此,将您的注释设置为BL.numberOfLine=0

然后在ViewDidLoad中

 self.table.estimatedRowHeight = 44.0 ;
self.table.rowHeight = UITableViewAutomaticDimension;
现在呢

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

瞧。。。。。。。。。。。。您做到了……

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


或者,您可以满足故事板的高度约束,并检查: [x] 在构建时删除

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


你能提供你想要的限制吗?比如从200分到400分,实际上我没有限制。因为可以没有行,也可以有10行。您说过需要动态大小,这意味着大小会改变。如果表格有0行,您希望的高度是多少?表格是否可以占据整个屏幕,或者是否将其限制为特定大小?当有0行时,高度应为0。如果有更多,就没有限制。高度是行数*行数+节数*节头高度我在XCode 5中找不到“升级到用户”约束。图标仍然是紫色的。我无法将IBOutlet与约束连接起来。别担心,只需执行IBOutlet,之后它将变为蓝色。还有其他方法可以在“实用程序”窗格中执行oultet。@JuanCatalan因为我使用故事板创建初始视图,所以在尝试向聚会添加新视图时,我很难弄清楚如何编辑预定义的布局约束,没有意识到可以将NSLayoutConstraint作为IBOutlet。谢谢你的回答,节省了我很多时间。太好了!它在XCode 8.2下工作正常。对于Swift 3:internal override func viewDidLayoutSubviews{let height=minself.view.bounds.size.height,self.tableView.contentSize.height self.dynamicTVHeight.constant=height self.view.LayoutFneed}这不是OP要求的。OP询问如何根据内容更改整个UITableView的高度。您所描述的内容会影响updateConstraints中单个单元格的高度。myTableView.contentSize.height=0,即使在注释掉将约束设置为myTableView.contentSize.height的行时,该表包含数据并显示行。您是否在其他地方更新了此内容?tableView.contentSize.height=0在updateConstraints中,即使该表包含数据并在注释“tableViewHeightConstraint?.constant=tableView.contentSize.height”时显示行。你在其他地方更新过吗?我每次都会崩溃,但有一个例外-无法实例化名为IBMLayoutConstraint的类'
override func updateViewConstraints() {
    super.updateViewConstraints()
    tableViewHeightConstraint?.constant = tableView.contentSize.height
}