【问题标题】:How to make UITableView's height dynamic with autolayout feature?如何使用自动布局功能使 UITableView 的高度动态化?
【发布时间】:2013-09-01 03:05:08
【问题描述】:

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

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

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

我应该怎么做才能给tableview动态大小?

【问题讨论】:

  • 你能提供你想要的限制吗?例如从 200 分到 400 分。
  • 其实我没有限制。因为可以没有行,也可以有 10 行。
  • 你说你想要一个动态大小,这意味着大小会发生变化。如果表格有 0 行,你想要哪个高度?表格可以占据整个屏幕还是要限制在一定的大小?
  • 行数为0时,高度应为0。如果行数更多,则没有限制。高度为 (row_count * row_height) + (section_count*section_header_height)

标签: ios uitableview autolayout


【解决方案1】:

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

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

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

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

在 Swift 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

【讨论】:

  • 我在 XCode 5 中找不到提升到用户约束。图标仍然是紫色的。而且我无法将 IBOutlet 与约束联系起来。
  • 别担心,只要做 IBOutlet,它就会变成蓝色。还有其他方法可以在“实用程序”窗格中执行 oultet。
  • @JuanCatalan 由于我使用故事板创建初始视图,当我尝试向聚会添加新视图时,我很难弄清楚如何编辑预定义的布局约束,但没有意识到这一点我们可以将 NSLayoutConstraint 作为 IBOutlet。感谢您的回答,为我节省了大量时间。
  • 太棒了!它工作正常 XCode 8.2。对于 Swift 3:内部覆盖 func viewDidLayoutSubviews() { let height = min(self.view.bounds.size.height, self.tableView.contentSize.height) self.dynamicTVHeight.constant = height self.view.layoutIfNeeded() }
【解决方案2】:

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

所以设置你 cmetsLbl.numberOfLine=0;

然后在 ViewDidLoad 中

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

现在

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

瞧…………你做到了……

【讨论】:

  • 这不是 OP 所要求的。 OP 询问如何根据其内容更改整个 UITableView 的高度。您所描述的会影响单个单元格的高度。
【解决方案3】:

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

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

在面向 iOS 7 的 Xcode 6 上测试。

【讨论】:

  • myTableView.contentSize.height = 0 inside updateConstraints 即使表包含数据并在注释掉设置约束等于myTableView.contentSize.height 的行时显示行。你在其他地方更新了吗?
【解决方案4】:

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

....

@IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint?

....

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

【讨论】:

  • tableView.contentSize.height = 0 在updateConstraints 内,即使表格包含数据并在注释掉“tableViewHeightConstraint?.constant = tableView.contentSize.height”时显示行。你在其他地方更新了吗?
【解决方案5】:

或者您可以满足情节提要的高度约束并检查: [x]在构建时移除

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

【讨论】:

  • 每次都会崩溃,但出现异常 - “无法实例化名为 IBNSLayoutConstraint 的类”
猜你喜欢
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2017-02-11
  • 2014-01-03
  • 2018-02-22
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多