如何在没有动画的情况下滚动行到可见
How to scrollRowToVisible without animations
在 Mac 上,当按住向上或向下箭头时,Mail 和 Finder 在其 table 视图上有一个看起来很结实的滚动条。行突出显示与列的顶部或底部齐平,并且行在没有动画的情况下逐步显示。
8年前好像是hard to not do this。现在我似乎无法停止 scrollRowToVisible
NSOutlineView
动画。
我尝试用 NSAnimationContext.beginGrouping()
或 CATransaction.begin()
等来包装调用,以将任何动画持续时间设置为 0.0
,但没有成功。
有没有办法让这个调用变得快速 - 或者我应该使用稍微低一点的东西?
编辑
这是我的代码。持续时间在这里没有影响。滚动动画总是有几帧,动画的端点略有不规则(即滚动到视图的底部边缘并不总是与底部边缘对齐)。
if selectedRows != outlineView.selectedRowIndexes {
outlineView.selectRowIndexes(selectedRows, byExtendingSelection: false)
// I would love this not to animate like in mail, but it cannot be stopped!!!
if selectedRows.one {
NSAnimationContext.beginGrouping()
NSAnimationContext.current.allowsImplicitAnimation = false
NSAnimationContext.current.duration = 0
outlineView.scrollRowToVisible(selectedRows.first!)
NSAnimationContext.endGrouping()
}
}
使用 runAnimationGroup 有相同的结果:
NSAnimationContext.runAnimationGroup( { current in
current.allowsImplicitAnimation = false
current.duration = 0
outlineView.scrollRowToVisible(selectedRows.first!)
}, completionHandler: nil)
我的 table 中有可变高度的行,但我不明白为什么这会有所不同。从上面的代码中,选择的变化总是在 table 中的任何移动之前突出显示,进一步表明滚动动画没有被删除。
我自己也有这个问题,并通过子类化 NSClipView
和覆盖 func scroll(to newOrigin: NSPoint)
解决了这个问题,如下所示:
override func scroll(to newOrigin: NSPoint) {
super.setBoundsOrigin(newOrigin)
}
对于包含子类剪辑视图的滚动视图,这应该完全禁用平滑滚动,这是您描述的动画效果。
在 Mac 上,当按住向上或向下箭头时,Mail 和 Finder 在其 table 视图上有一个看起来很结实的滚动条。行突出显示与列的顶部或底部齐平,并且行在没有动画的情况下逐步显示。
8年前好像是hard to not do this。现在我似乎无法停止 scrollRowToVisible
NSOutlineView
动画。
我尝试用 NSAnimationContext.beginGrouping()
或 CATransaction.begin()
等来包装调用,以将任何动画持续时间设置为 0.0
,但没有成功。
有没有办法让这个调用变得快速 - 或者我应该使用稍微低一点的东西?
编辑
这是我的代码。持续时间在这里没有影响。滚动动画总是有几帧,动画的端点略有不规则(即滚动到视图的底部边缘并不总是与底部边缘对齐)。
if selectedRows != outlineView.selectedRowIndexes {
outlineView.selectRowIndexes(selectedRows, byExtendingSelection: false)
// I would love this not to animate like in mail, but it cannot be stopped!!!
if selectedRows.one {
NSAnimationContext.beginGrouping()
NSAnimationContext.current.allowsImplicitAnimation = false
NSAnimationContext.current.duration = 0
outlineView.scrollRowToVisible(selectedRows.first!)
NSAnimationContext.endGrouping()
}
}
使用 runAnimationGroup 有相同的结果:
NSAnimationContext.runAnimationGroup( { current in
current.allowsImplicitAnimation = false
current.duration = 0
outlineView.scrollRowToVisible(selectedRows.first!)
}, completionHandler: nil)
我的 table 中有可变高度的行,但我不明白为什么这会有所不同。从上面的代码中,选择的变化总是在 table 中的任何移动之前突出显示,进一步表明滚动动画没有被删除。
我自己也有这个问题,并通过子类化 NSClipView
和覆盖 func scroll(to newOrigin: NSPoint)
解决了这个问题,如下所示:
override func scroll(to newOrigin: NSPoint) {
super.setBoundsOrigin(newOrigin)
}
对于包含子类剪辑视图的滚动视图,这应该完全禁用平滑滚动,这是您描述的动画效果。