gpt4 book ai didi

ios - 如何在不跳转的情况下使用 CADisplayLink 和 UITableViewAutomaticDimension 在滚动时对 UITableView 执行更新?

转载 作者:IT王子 更新时间:2023-10-29 05:38:24 31 4
gpt4 key购买 nike

Link to the subclass of UITableView

为什么 UITableView 在滚动时跳转?你能帮帮我吗?

for the one who help me I start and award later ANOTHER bounty of 100:-)

如何对 UITableView 进行一些更改并设置其 contentOffset

这就是我设置 scrollDisplayLink 的方式:

scrollDisplayLink = CADisplayLink(target: self, selector: Selector("scrollTable"))
scrollDisplayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
cellForCurrentIndexPath?.hidden = true

然后在 scrollTable 中我做了以下事情:

func scrollTable() {
var newOffset = CGPointMake(currentContentOffset.x, currentContentOffset.y + scrollRate * 10)

if currentContentSize.height < frame.size.height {
newOffset = currentContentOffset
} else if newOffset.y > currentContentSize.height - frame.size.height {
newOffset.y = currentContentSize.height - frame.size.height
} else if newOffset.y < 0 {
newOffset = CGPointZero
}

contentOffset = newOffset


if coveredIndexPath != nil && coveredIndexPath! != currentIndexPath! {

let verticalPositionInCoveredCell = longPressGestureRecognizer.locationInView(cellForRowAtIndexPath(coveredIndexPath!)).y

if direction == .Down && heightForCoveredCell - verticalPositionInCoveredCell <= heightForCurrentCell / 2 {
print("moved down")

beginUpdates() //1
moveRowAtIndexPath(currentIndexPath!, toIndexPath: coveredIndexPath!) //2
currentIndexPath = coveredIndexPath //3
endUpdates() //4

}
}
}

除非注释行 1-4 或我禁用 UITableViewAutomaticDimension,否则滚动很好。当它们未被注释时,当 currentContentOffset 与滚动时的 0 不同时,表格会跳转。为什么会这样?是线程问题还是其他问题?

注意:

UITableViewUITableViewAutomaticDimension 配合使用:

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}

最佳答案

让我们从显而易见的开始:

UITableView 是 UIScrollView 的子类,我们可以使用它的一些属性。

几乎每年都有关于如何自定义 UIScrollviews 的精彩 WWDC 演讲。

他们建议像在里面一样做事

// is called every frame of scrolling and zooming
override func layoutSubviews() {
...
super.layoutSubviews()
...
}

当用户滚动时调用每一帧。

我在滚动时大量使用这个地方来处理 currentContentOffset 以及大小和坐标系统(我子类化了 UIScrollView 而不是 UITableView)。

优点:

  • 您可以免费获得每一帧的回调,无需使用 CADisplayLink
  • 您正在更改 contentOffset 等 UIScrollView 期望更改的内容。

希望对你有帮助

附言

根据我的实验,在 UIScrollView 中滚动的 View 不能高于 8000 像素左右。

因此 Apple 的 UITableView 必须实现一种称为无限滚动的策略,在有关 UIScrollViews 的 WWDC 视频之一中对此进行了描述:

简而言之:

表格的一小部分被绘制一次,然后在不重绘表格内容的情况下滚动。当用户滚动过远时,会绘制滚动表格的不同部分,同时 UITableView 实现会更改 contentOffset。

这可能是在您的 layoutSubviews() 实现中调用 super.layoutSubviews() 时完成的。

关于ios - 如何在不跳转的情况下使用 CADisplayLink 和 UITableViewAutomaticDimension 在滚动时对 UITableView 执行更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32674084/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com