通过其内容dynamic设置UIScrollView和UITableView的高度

我相当新的iOS开发,我一直坚持这一两天

我有一个UITableViewUIImageView里面的UIScrollViewUIImageView是在表顶部和高度是静态的,所以我没有任何问题,这个问题是UITableView ,我需要dynamic获取高度基于内容并将该高度设置为表格的高度约束和scrollview的内容。

细胞是自我大小的,所以细胞的高度根据内容而变化。 到目前为止我所能做到的最好的方式是使用UITableView contentSize.height属性来获取高度,但显然这将返回基于estimatedRowHeight的高度,而不是每行的实际高度。

代码:

 override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = self tableView.delegate = self tableView.estimatedRowHeight = rowHeight tableView.rowHeight = UITableViewAutomaticDimension tableView.layoutIfNeeded() tableHeight.constant = tableView.contentSize.height scrollView.contentSize.height = imageView.bounds.height + tableView.contentSize.height } 

我试过了:

  • 通过使用UITableView contentSize.height属性获取高度,如代码中所示,并在之前进行了解释。
  • willDisplayCell上分别获取每行的高度,并将其添加到表格的高度约束和scrollview的contentSize中。 但看起来像这样增加了比实际更多的行,给了我一堆在表的末尾的空单元格。 willDisplayCell的代码:

     let cellHeight = cell.bounds.height tableHeight.constant += cellHeight scrollView.contentSize.height += cellHeight 
  • 和以前一样,除了我在cellForRowAtIndexPath尝试了相同的结果。

苹果文档不鼓励在UIScrollViewembeddedUITableView

您不应该在UIS​​crollView对象中embeddedUIWebView或UITableView对象。 如果这样做,可能会导致意外的行为,因为两个对象的触摸事件可能会混淆并被错误地处理。

要解决您的问题,您可以将UIImageView放在标题视图中,或者更改第一行的单元格以显示图像。 然后你会调整使用你的UITableViewDelegate的细胞高度,特别是tableView:heightForRowAtIndexPath:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // adjust the return based on the indexPath return 30; } 

我有同样的问题,我find了解决办法。 我有一个UIScrollView里面的TableView,不知道如何dynamic设置UIScrollView的高度。 首先你必须设置你的scrollView,你可以在这里查看stackOverFlow( 如何在Storyboard中使用UIScrollView )。 下一步是将tableView的约束设置为scrollView(它应该是tableView的superView):前导,尾随和底部(底部是0和其他任何你想要的),以及最接近的对象的最上面的约束与常数无论你想要的。 所以现在你必须dynamic设置UIScrollView的高度。 它取决于2件事:设备屏幕的高度和tableView的高度(因为tableView的内容是dynamic的)。 你必须使用这个扩展来使设备的确定更加舒适: iOS:如何确定Swift中当前的iPhone /设备模型? 之后,我做了这些事情:

 var viewHeight: CGFloat = 0 var modelDevice: String { get { return UIDevice.currentDevice().modelName } } var tableViewHeight: CGFloat { get { // 90 is my tableViewCell's row height return CGFloat(detail.cart.count) * 90 } } func configureSelfHeight(modelDevice: String) { switch modelDevice { case "iPhone 4", "iPhone 4s": viewHeight = 480 case "iPhone 5", "iPhone 5c", "iPhone 5s", "iPhone SE": viewHeight = 568 case "iPhone 6", "iPhone 6s", "iPhone 7": viewHeight = 667 case "iPhone 6 Plus", "iPhone 6s Plus", "iPhone 7 Plus": viewHeight = 736 default: viewHeight = 568 } scrollView.contentSize.height = viewHeight + tableViewHeight } 

并在viewDidLayoutSubviews()中调用此方法:

  override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() configureSelfHeight(modelDevice) } 

我希望它会帮助你。