【问题标题】:How to change color of divider in NSSplitView?如何更改 NSSplitView 中分隔线的颜色?
【发布时间】:2012-06-09 06:50:44
【问题描述】:

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

无效。

【问题讨论】:

    标签: cocoa xcode4 appkit nssplitview


    【解决方案1】:

    在 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 上停止工作......但似乎这工作。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 从 macOS 11 开始,这似乎不再起作用,不确定是否是错误。
      • @cgiacomi 我刚刚在 macOS 11 上进行了测试,它仍然适用于我。确保在加载 splitviewcontroller 后调用 windowDidLoad 中的代码
      • 我最终继承了 NSSplitView 并重写了 drawDivider()。但是 tnx 对于您的回复,我已对您的回答表示赞同,现在也对您的评论表示赞同,因为他们确实帮助了我。但至少对我来说,似乎只有子类化才有效。 Tnx 再次为您提供帮助。
      【解决方案3】:

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

      【讨论】:

      • 这很棒。没想到这是可能的。
      【解决方案4】:

      我没有看到任何地方提到的一个重要点是,如果您在拆分视图中覆盖 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】:

        实际上,只需继承 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 并选择所需的拆分器颜色。

        【讨论】:

          【解决方案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);
          }
          

          【讨论】:

            猜你喜欢
            • 2014-08-05
            • 1970-01-01
            • 1970-01-01
            • 2011-01-23
            • 2012-02-14
            • 1970-01-01
            • 2015-10-03
            • 2013-09-19
            • 1970-01-01
            相关资源
            最近更新 更多