通过其内容dynamic设置UIScrollView和UITableView的高度
我相当新的iOS开发,我一直坚持这一两天
我有一个UITableView
和UIImageView
里面的UIScrollView
, UIImageView
是在表顶部和高度是静态的,所以我没有任何问题,这个问题是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
尝试了相同的结果。
苹果文档不鼓励在UIScrollView
embeddedUITableView
:
您不应该在UIScrollView对象中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) }
我希望它会帮助你。