Tableview scrollToRow(at:at:animated) 导致多次调用 scrollViewDidScroll(_)
Tableview scrollToRow(at:at:animated) causing scrollViewDidScroll(_) to be called multiple times
我已经检查了所有关于为什么我的 UITableView 一整天都表现如此奇怪的可能性。最后,现在我注意到了一些奇怪的事情。我需要一些帮助来确定我注意到的是否属实,或者问题可能出在其他地方。
所以在 tableView(_:didSelectRowAt:) 中,我想在调整所有单元格的高度后滚动到特定单元格。 (我正在增加所有单元格的高度。)
这是我的 scrollViewDidScroll(_) 方法主体的一小部分相关部分,负责确定屏幕部分的哪一部分被点击(我需要它才能让其他一些东西起作用):
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
let touchLocation = scrollView.panGestureRecognizer.location(in: containerView)
let touchX = touchLocation.x
print("X: \(touchX)")
.
.
.
}
现在在我的 didSelectRowAt 中,当我将 scrollToRow 调用为:
tableView.scrollToRow(at: indexPath, at: .top, animated: false)
我得到这个作为输出:
X: 132.0 (old touch x)
X: 130.66665649414062 (old touch x when scrolling stopped)
X: 188.66665649414062 (new touch x of tap)
X: 188.66665649414062 (not sure why this was printed again)
但是现在当我执行 scrollToRow 时:
tableView.scrollToRow(at: indexPath, at: .top, animated: true)
X: 160.3333282470703
X: 160.3333282470703 (new touch x of tap)
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
.
.
.
174 times
.
.
.
X: 177.66665649414062
这很奇怪。有人可以解释为什么会这样吗?
获取代码
抱歉之前的回答。
也许这会有所帮助,
scrollViewDidScroll 每次滚动 tableview 时,可能你必须使用 scrollViewDidEndDragging
、scrollViewWillBeginDecelerating
、scrollViewDidEndDecelerating
scrollViewDidScroll
在滚动视图滚动的每一帧都会被调用,不管它是由用户完成的还是通过调用 scrollTo 方法完成的。我认为,当用户滚动时,这最多可以达到每秒 120 次。
如果您想在滚动视图停止时执行某些操作,您应该使用 didEndDeccelerating
和 didEndScrollingAnimation
委托方法。
我已经检查了所有关于为什么我的 UITableView 一整天都表现如此奇怪的可能性。最后,现在我注意到了一些奇怪的事情。我需要一些帮助来确定我注意到的是否属实,或者问题可能出在其他地方。
所以在 tableView(_:didSelectRowAt:) 中,我想在调整所有单元格的高度后滚动到特定单元格。 (我正在增加所有单元格的高度。)
这是我的 scrollViewDidScroll(_) 方法主体的一小部分相关部分,负责确定屏幕部分的哪一部分被点击(我需要它才能让其他一些东西起作用):
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
let touchLocation = scrollView.panGestureRecognizer.location(in: containerView)
let touchX = touchLocation.x
print("X: \(touchX)")
.
.
.
}
现在在我的 didSelectRowAt 中,当我将 scrollToRow 调用为:
tableView.scrollToRow(at: indexPath, at: .top, animated: false)
我得到这个作为输出:
X: 132.0 (old touch x)
X: 130.66665649414062 (old touch x when scrolling stopped)
X: 188.66665649414062 (new touch x of tap)
X: 188.66665649414062 (not sure why this was printed again)
但是现在当我执行 scrollToRow 时:
tableView.scrollToRow(at: indexPath, at: .top, animated: true)
X: 160.3333282470703
X: 160.3333282470703 (new touch x of tap)
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
X: 177.66665649414062
.
.
.
174 times .
.
.
X: 177.66665649414062
这很奇怪。有人可以解释为什么会这样吗?
获取代码抱歉之前的回答。
也许这会有所帮助,
scrollViewDidScroll 每次滚动 tableview 时,可能你必须使用 scrollViewDidEndDragging
、scrollViewWillBeginDecelerating
、scrollViewDidEndDecelerating
scrollViewDidScroll
在滚动视图滚动的每一帧都会被调用,不管它是由用户完成的还是通过调用 scrollTo 方法完成的。我认为,当用户滚动时,这最多可以达到每秒 120 次。
如果您想在滚动视图停止时执行某些操作,您应该使用 didEndDeccelerating
和 didEndScrollingAnimation
委托方法。