7

我们可以改变分隔线的颜色吗?苹果文档说,我们可以为此覆盖 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];

不工作。

4

6 回答 6

9

这个答案可能迟到了,但是:
如果您使用的是 Interface Builder,则可以通过转到NSSplitView( cmd++ alt)的身份检查器并添加颜色类型3的用户定义的运行时属性来更改属性。dividerColor

于 2015-11-27T21:37:23.030 回答
8

实际上,简单的子类化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,type = Color 并选择所需的拆分器颜色。

于 2014-03-27T09:59:03.363 回答
7

我也尝试过子类 - (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);
}
于 2012-06-13T04:37:10.910 回答
5

根据 Palle 的回答,但可以在代码中动态更改颜色,我目前正在使用这个解决方案(Swift 4):

splitView.setValue(NSColor.red, forKey: "dividerColor")

如果你的 splitview 控件是 NSSplitViewController 的一部分,你应该使用这样的东西:

splitViewController?.splitView.setValue(NSColor.red, forKey: "dividerColor")
于 2018-10-01T15:10:38.510 回答
2

在 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 一起工作......但似乎这可行。

于 2021-03-11T13:59:31.647 回答
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);
}
于 2014-11-14T17:34:46.577 回答