【发布时间】:2018-04-15 10:43:23
【问题描述】:
重要提示:我的问题不在于我实施的是 didDeelectRowAt 而不是 didSelectRowAt。已经检查过了:)
我有一个UITableView,它显示在模态显示的视图控制器的部分屏幕上。当用户拖动它时,它会调整到全屏并返回到某个定义的最小高度。我通过从UIScrollViewDelegate 实现以下方法来做到这一点:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
guard !scrollView.isDecelerating else { return }
let contentOffset = scrollView.contentOffset.y
if tableViewHeightConstraint.constant < view.frame.height && contentOffset > 0.0 {
tableViewHeightConstraint.constant = min(contentOffset + tableViewHeightConstraint.constant, view.frame.height)
scrollView.contentOffset.y = 0.0
return
}
if tableViewHeightConstraint.constant > minViewHeight && contentOffset < 0.0 {
tableViewHeightConstraint.constant = max(tableViewHeightConstraint.constant + contentOffset, minViewHeight)
scrollView.contentOffset.y = 0.0
}
}
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
// Here I have some calculations if depending the dragging end position and the velocity the end size should be full screen or `minViewHeight`
// After calculating what the end size should be I'm animating the size change
heightConstraint.constant = newConstraintHeight
UIView.animate(withDuration: TimeInterval(calculatedAnimationDuration), delay: 0.0, options: .curveEaseOut, animations: {
self.view.layoutIfNeeded()
}, completion: nil)
}
关于调整大小和滚动的一切工作正常,但有一个问题我无法弄清楚为什么会发生这种情况。如下:
- 当带有表格视图的视图控制器第一次以最小高度显示并且我点击一个单元格时,它可以正常工作。
- 如果我拖动以将表格视图扩展到全屏高度并点击一个单元格,它仍然可以正常工作。
- 如果我拖动以将表格视图扩展到全屏高度,然后再次拖动以将其返回到最小高度,然后点击单元格,则没有任何反应,根本不会调用
UIScrollViewDelegate或UITableViewDelegate方法.如果我再次点击一个单元格,一切正常。
我注意到的一件事是,在将表格视图拖回最小高度后,滚动指示器并没有隐藏。第一次点击它隐藏,第二次点击didSelectRowAt 被调用。
更新:
这里是该问题的测试仓库:https://github.com/nikmin/DragTest
如果拖动不完美,请不要介意,我只是放了一些东西让任何人都可以尝试,但我认为问题很容易重现。
还有一件事...如果您从全尺寸一直拖动到底部以使表格视图达到最小高度并继续拖动以使内容偏移
【问题讨论】:
-
第一次(未注册)触摸后滚动指示器是否消失?
-
@Luzo 是的,确实如此
-
@nikmin 你能提供一个调试仓库吗?我认为为yoi找到问题会更容易更快。
-
@trungduc 我添加了repo,请看一下
-
@nikmin 我已经为您的问题添加了答案,如果可行,请告诉我;)
标签: ios swift uitableview uiscrollview uiscrollviewdelegate