我们可以更改分隔线的颜色吗? Apple文档说,我们可以在NSSplitView的子类中覆盖-dividerColor,但这对我不起作用,或者我的理解不正确。我也尝试在分隔符上创建颜色层,例如:
colorLayer = [CALayer layer];
NSRect dividerFrame = NSMakeRect([[self.subviews objectAtIndex:0] frame].size.width, [[self.subviews objectAtIndex:0] frame].origin.y, [self dividerThickness], self.frame.size.height);
[colorLayer setBackgroundColor:[color coreGraphicsColorWithAlfa:1]];
[colorLayer setFrame:NSRectToCGRect(dividerFrame)];
[self.layer addSublayer:colorLayer];
不起作用。
答案 0 :(得分:7)
实际上,简单地对NSSplitView
进行子类化并覆盖-(void)dividerColor
有效,但仅适用于细分割器或厚分割器。
我已经创建了简单的可配置拆分视图,如下所示:
@interface CustomSplitView : NSSplitView
@property NSColor* DividerColor
@end
@implementation CustomSplitView
- (NSColor*)dividerColor {
return (self.DividerColor == nil) ? [super dividerColor] : self.DividerColor;
}
@end
然后在Interface Builder中,将拆分视图的自定义类指定为CustomSplitView
,并使用键路径= DividerColor添加新的用户定义的运行时属性,键入= Color并选择所需的拆分颜色。
答案 1 :(得分:6)
我也尝试过继承- (void)dividerColor
,我不确定为什么它不起作用,即使我知道它被调用(并且它在文档中)。
更改分隔符颜色的一种方法是子类- (void)drawDividerInRect:(NSRect)aRect。但是,出于某种原因,这个方法没有被调用,我已经在网上检查了答案,但找不到任何东西,所以我最终从drawRect
调用它。这是子类NSSplitView的代码:
-(void) drawRect {
id topView = [[self subviews] objectAtIndex:0];
NSRect topViewFrameRect = [topView frame];
[self drawDividerInRect:NSMakeRect(topViewFrameRect.origin.x, topViewFrameRect.size.height, topViewFrameRect.size.width, [self dividerThickness] )];
}
-(void) drawDividerInRect:(NSRect)aRect {
[[NSColor redColor] set];
NSRectFill(aRect);
}
答案 2 :(得分:6)
这个答案可能会迟到但是:
如果您使用的是Interface Builder,则可以通过转到NSSplitView
(cmd
+ alt
+ 3
)的身份检查器并添加用户来更改属性为Color类型dividerColor
定义的运行时属性。
答案 3 :(得分:2)
基于Palle的回答,但可以在代码中动态更改颜色,我目前正在使用此解决方案(Swift 4):
splitView.setValue(NSColor.red, forKey: "dividerColor")
如果您的splitview控件是NSSplitViewController的一部分,则应使用以下内容:
splitViewController?.splitView.setValue(NSColor.red, forKey: "dividerColor")
答案 4 :(得分:0)
我在任何地方都没有提到的一个重点是,如果你在分割视图中覆盖drawRect,那么你必须调用super - 否则drawDividerInRect:永远不会被调用。所以,它应该是这样的:
- (void)drawRect:(NSRect)dirtyRect {
// your other custom drawing
// call super last to draw the divider on top
[super drawRect:dirtyRect];
}
- (void)drawDividerInRect:(NSRect)aRect {
[[NSColor blueColor] set];
NSRectFill(aRect);
}
答案 5 :(得分:0)
在 Swift 和 macOS 11 中,我可以通过简单地继承 NSSPlitView 并仅覆盖 drawDivider() 来实现这一点
import Foundation
import AppKit
class MainSplitView: NSSplitView {
override func drawDivider(in rect: NSRect) {
NSColor(named: "separatorLinesColor")?.setFill()
rect.fill()
}
}
我之前曾尝试过其他一些方法,列在此处,以前可以使用的方法在 macOS 11 上停止工作......但似乎这有效。