由于NSSplitView不允许隐藏其分隔符(委托方法仅允许隐藏位于拆分视图边缘的分隔符),我选择了NSSplitView的子类并重写其draw方法以防止特定分隔符被绘制。

但是,如果我折叠draw(rect:)drawDivider(in:),则NSSplitView不再为它的分隔线设置动画,如果我折叠这样的项目

activityItem.animator().isCollapsed = collapsed


如果我直接调用super而不添加自己的图形代码,甚至会发生这种情况

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
}


上面的代码足以完全破坏动画。

基本上,我想要实现的是在分隔符旁边隐藏一个拆分视图项,但是显然要问NSSplitView而不完全重新实现它实在太多了。

我在我的最后一根稻草上。还有其他方法来隐藏项目+分隔符吗?

最佳答案

好的,我采用了一种完全不同的方式,并找到了一种使其工作的方式。因此,如果您要完全自定义分隔线,这就是您的方法。


子类NSSplitView并从0返回dividerThickness


因此,您的新拆分视图现在根本不会显示分隔线,但是您可以在需要的位置手动添加它们


NSBox或自定义的分隔线视图添加到希望分隔线显示在拆分视图子视图中的位置,最好在子视图的顶部。
覆盖拆分视图委托方法splitView(:additionalEffectiveRectOfDividerAt:),并手动返回与您的自定义NSBox分隔符匹配的矩形


您可能需要在convert(:from:)坐标之间的NSView才能获得有效的矩形,但这确实可行!委托可能看起来像这样

override func splitView(_ splitView: NSSplitView, additionalEffectiveRectOfDividerAt dividerIndex: Int) -> NSRect {
    let item = splitViewItems[dividerIndex]
    let itemView = item.viewController.view
    let frame = view.convert(itemView.bounds, from: itemView)

    let dividerFrame = CGRect(x: 0,
                              y: view.bounds.height - frame.minY,
                              width: frame.width,
                              height: 1)

    return dividerFrame
}


你有它。自定义分隔线也可以与动画一起使用!

关于swift - 在NSSplitView中隐藏分隔线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60165351/

10-12 00:32
查看更多