如何在NSSplitView中更改分隔符的颜色?

时间:2012-06-05 08:45:55

标签: cocoa xcode4 appkit nssplitview

我们可以更改分隔线的颜色吗? 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];

不起作用。

6 个答案:

答案 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,则可以通过转到NSSplitViewcmd + 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 上停止工作......但似乎这有效。