如何在没有动画的情况下滚动行到可见

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)
}

对于包含子类剪辑视图的滚动视图,这应该完全禁用平滑滚动,这是您描述的动画效果。