按内容

时间:2016-07-06 16:42:29

标签: ios swift uitableview uiscrollview

我对iOS开发很新,我已经坚持了几天

我在UITableView内有UIImageViewUIScrollViewUIImageView位于表格的顶部,高度是静态的,所以我没有任何问题问题是UITableView,我需要根据内容动态获取高度,并将高度设置为表格的高度约束和scrollview的内容大小。

细胞是自我大小的,因此细胞的高度根据内容而变化。到目前为止我能做的最好的事情就是使用contentSize.height UITableView属性获得高度,但显然这会返回基于estimatedRowHeight i设置的高度,而不是每行的实际高度。

代码:

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
}

我尝试了什么:

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

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

2 个答案:

答案 0 :(得分:4)

Apple documentation不鼓励在UITableView中嵌入UIScrollView

  

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

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

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

答案 1 :(得分:0)

我有同样的问题,我找到了解决方案。我在UIScrollView中有一个TableView,并且不知道如何设置UIScrollView的动态高度。首先你必须设置你的scrollView,你可以在stackOverFlow(How to use UIScrollView in Storyboard)中查看它。下一步是将tableView的约束设置为scrollView(它应该是tableView的超级视图):前导,尾随和底部(底部是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)
}

我希望它会对你有所帮助。:)