【问题标题】:Dynamically set UIScrollView and UITableView height by its content通过其内容动态设置 UIScrollView 和 UITableView 高度
【发布时间】:2016-11-08 19:37:03
【问题描述】:

我对 iOS 开发很陌生,我已经被这个问题困住了几天

我在UIScrollView 中有一个UITableViewUIImageViewUIImageView 在桌子的顶部,高度是静态的,所以我对此没有任何问题,问题是@ 987654326@,我需要根据内容动态获取高度,并将该高度设置为表格的高度约束和滚动视图的内容大小。

单元格是自行调整大小的,因此单元格的高度会因内容而异。到目前为止,我能做的最好的事情是使用UITableViewcontentSize.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
}

我尝试过的:

  • 使用UITableViewcontentSize.height 属性获取高度,如代码所示和前面的解释。
  • willDisplayCell上单独获取每一行的高度,并将其添加到表格的高度约束和滚动视图的contentSize。但看起来这增加了比实际更多的行,在表格的末尾给了我一堆空单元格。 willDisplayCell里面的代码:

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

【问题讨论】:

  • 第一个问题,为什么在滚动视图中使用表格(具有内置滚动视图)(并设置高度以否定表格的滚动功能)?其次,为了执行您所要求的操作,您需要在 for 循环中手动调用 cellForRoAtIndexPath 来遍历您的表数据。然后获取从该函数返回的每个单元格的高度,并结合所有高度以获得全局表格高度。但我回到第一个问题,你为什么要重做已经为你做的事情(在滚动视图中滚动的表格)?
  • 访问此内容以获得答案 stackoverflow.com/questions/5628527/…

标签: ios swift uitableview uiscrollview


【解决方案1】:

Apple documentation 不鼓励在 UIScrollView 中嵌入 UITableView

您不应该在 UIScrollView 对象中嵌入 UIWebView 或 UITableView 对象。如果这样做,可能会导致意外行为,因为这两个对象的触摸事件可能会混淆和错误处理。

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

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我找到了解决方案。我在 UIScrollView 中有一个 TableView,但不知道如何动态设置 UIScrollView 的高度。首先你必须设置你的滚动视图,你可以在 stackOverFlow (How to use UIScrollView in Storyboard) 中查看它。下一步是将tableView的约束设置为scrollView(它应该是tableView的superView):前导,尾随和底部(底部为0,其他任何你想要的),顶部约束到最近的对象,你想要的常量。 所以现在你必须动态设置 UIScrollView 的高度。这取决于两件事:设备屏幕的高度和 tableView 的高度(因为 tableView 的内容是动态的)。 您必须使用此扩展程序才能使设备确定更加舒适:iOS: How to determine the current iPhone/device model in Swift? 在这些事情之后,我这样做了:

    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)
    }
    

    希望对你有帮助。:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-17
      • 2013-04-28
      • 1970-01-01
      • 2021-09-12
      • 2011-07-14
      • 1970-01-01
      • 2016-01-20
      • 2021-12-12
      相关资源
      最近更新 更多