在 NSSplitView 中隐藏分隔线
Hiding Dividers in NSSplitView
因为 NSSplitView
不允许隐藏它的分隔线(委托方法只允许隐藏分割视图边缘的分隔线),我选择继承 NSSplitView
并覆盖它的绘图防止绘制特定分隔线的方法。
但是,一旦我重写 draw(rect:)
或 drawDivider(in:)
,如果我像这样折叠一个项目,NSSplitView
就不再为其分隔线设置动画
activityItem.animator().isCollapsed = collapsed
如果我不添加自己的绘图代码直接调用super
甚至会发生
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
上面的代码足以完全破坏动画。
基本上我想要实现的是在分隔线旁边隐藏一个拆分视图项目,但这显然对 NSSplitView
没有完全重新实现它的要求太过分了。
我已经迫不及待了。还有其他方法来完成隐藏项目 + 分隔线吗?
好的,我走了一条完全不同的路,找到了让它工作的方法。因此,如果您正在尝试完全自定义分隔线,这就是您的做法。
- 子类
NSSplitView
和 return 0
来自 dividerThickness
因此您的新拆分视图现在根本不会显示分隔线,但您可以在需要的位置手动添加分隔线
添加 NSBox
或您希望分隔线显示在拆分视图子视图中的自定义分隔线视图,最好是在子视图的顶部。
覆盖拆分视图委托方法 splitView(:additionalEffectiveRectOfDividerAt:)
并手动 return 符合您的自定义 NSBox
分隔符的矩形
您可能需要在 NSView
坐标之间 convert(:from:)
以获得有效的矩形,但它有效!代表可能看起来像这样
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
}
给你。也适用于动画的自定义分隔线!
因为 NSSplitView
不允许隐藏它的分隔线(委托方法只允许隐藏分割视图边缘的分隔线),我选择继承 NSSplitView
并覆盖它的绘图防止绘制特定分隔线的方法。
但是,一旦我重写 draw(rect:)
或 drawDivider(in:)
,如果我像这样折叠一个项目,NSSplitView
就不再为其分隔线设置动画
activityItem.animator().isCollapsed = collapsed
如果我不添加自己的绘图代码直接调用super
甚至会发生
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
上面的代码足以完全破坏动画。
基本上我想要实现的是在分隔线旁边隐藏一个拆分视图项目,但这显然对 NSSplitView
没有完全重新实现它的要求太过分了。
我已经迫不及待了。还有其他方法来完成隐藏项目 + 分隔线吗?
好的,我走了一条完全不同的路,找到了让它工作的方法。因此,如果您正在尝试完全自定义分隔线,这就是您的做法。
- 子类
NSSplitView
和 return0
来自dividerThickness
因此您的新拆分视图现在根本不会显示分隔线,但您可以在需要的位置手动添加分隔线
添加
NSBox
或您希望分隔线显示在拆分视图子视图中的自定义分隔线视图,最好是在子视图的顶部。覆盖拆分视图委托方法
splitView(:additionalEffectiveRectOfDividerAt:)
并手动 return 符合您的自定义NSBox
分隔符的矩形
您可能需要在 NSView
坐标之间 convert(:from:)
以获得有效的矩形,但它有效!代表可能看起来像这样
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
}
给你。也适用于动画的自定义分隔线!