35

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

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

但大小始终为 200px。如果内容大于此,我应该向下滚动以查看较低的行。

我应该怎么做才能给 tableview 动态大小?在此处输入图像描述

4

5 回答 5

66

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

1) 在 Xcode 中转到情节提要并单击您的表格视图以选择它。

2) 在 Utilities 窗格中(见图 1),确保定义了 table view 高度的约束。

表视图高度约束

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

在斯威夫特 3

@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint!

在目标 C

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

4)在情节提要中返回高度约束UITableView并验证右侧的图标已将颜色从紫色变为蓝色(见图2)

出口后的表视图高度约束

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

于 2013-08-29T13:25:22.200 回答
4

通过 xib 或情节提要创建您的单元格。给出它的出口内容。现在在 CellForRowAtIndexPath 中调用它。例如。如果要根据评论的标签文本设置单元格高度。在此处输入图像描述

所以设置你 commentsLbl.numberOfLine=0;

然后在 ViewDidLoad

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

现在

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

瞧…………你做到了……

于 2015-05-19T14:26:24.697 回答
2

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

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

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

于 2015-01-28T03:54:07.433 回答
2

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

……

@IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint?

……

override func updateViewConstraints() {
    super.updateViewConstraints()
    tableViewHeightConstraint?.constant = tableView.contentSize.height
}
于 2015-08-17T12:28:56.053 回答
-1

或者您可以从情节提要中满足高度约束并检查: [x]Remove at build time

在此处输入图像描述

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

在此处输入图像描述

于 2018-08-28T21:53:50.260 回答