UIScrollView 有时会在更改内部 UITableView 的高度时失去滚动

Posted

技术标签:

【中文标题】UIScrollView 有时会在更改内部 UITableView 的高度时失去滚动【英文标题】:UIScrollView sometimes loose its scroll when changing the height of UITableView inside 【发布时间】:2017-11-15 07:13:25 【问题描述】:

好的,我有一个简单的UIScrollView 有两个子视图:UIViewUITableView 设置为垂直模式。它们都有自己的高度限制:

我是这样设置的:

tableViewHeightConstraint.constant = CGFloat(height) //height is calculated based on number of cells multiplied 130

calendarViewHeightConstraint.constant = UIApplication.shared.keyWindow!.rootViewController!.traitCollection.isIpad ? 630 : 470

但有时当我滚动到底部,然后在表格视图中添加一个新单元格并重新计算高度时,滚动视图的滚动似乎被锁定,我可以弹跳但滚动消失,我只能弹跳,虽然我知道我可以滚动到屏幕上当前视图上方或下方的内容。可能是什么原因?

我真的必须这样做。不可能将我的视图放在表格视图标题视图中。请让我们离开这个话题;)

这是我重新计算高度的地方:

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) 

        tableView.endUpdates()
        updateView()
        updateTableViewHeight()


private func updateTableViewHeight() 

    var height = goalFetchedResultsController.fetchedObjects!.count * 130

    height += 45

    if MyType.selected.hasMonthReport 
        height += 130
    

    if MyType.selected.hasAnnualReport 
        height += 70
        height += 130
    

    tableViewHeightConstraint.constant = CGFloat(height)

NSFetchedResultsController 的委托内添加了新单元格。

【问题讨论】:

添加新单元格和重新计算高度等时能否提供代码? 我更新了问题;) 【参考方案1】:

我认为您需要更改 TableView 的 高度 的计算方式,例如,

var height = tablView.contentSize.heigh // You can do + or - here 

// your other stuff of calculation.
tableViewHeightConstraint.constant = CGFloat(height)

self.view.layoutIfNeeded() // You need to call after change constraint.

【讨论】:

在主视图上我应该打电话给layoutIfNeeded吗?为什么我不能像现在这样计算它?;) 只是我感兴趣......

以上是关于UIScrollView 有时会在更改内部 UITableView 的高度时失去滚动的主要内容,如果未能解决你的问题,请参考以下文章

UITextField辞职第一响应者后如何更改UIScrollView contentSize

在 UIScrollView 中为 zoomScale 设置动画时不需要的滚动

当用户触摸 uiscrollview 时隐藏表格

UIPickerView 选择更新 UITextFields 的 NSArray

如何使用 UISlider 在 UIScrollView 中进行放大、缩小?

UITable 视图项有时会在选择时消失(取决于屏幕大小)