Как изменить цвет разделителя в NSSplitView?

Можем ли мы изменить цвет делителя? Документация Apple говорит, что для этого мы можем переопределить -dividerColor в подклассе NSSplitView, но у меня это не работает, или мое понимание неверно. Также я пытаюсь создать цветовой слой над разделителем, например:

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 ответов

Решение

Я пробовал создавать подклассы - (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);
}

Этот ответ может быть поздно, но:
Если вы используете Интерфейсный Разработчик, можно изменить свойство, перейдя в Инспектор Идентификации NSSplitView (cmd+alt+3) и добавление пользовательского атрибута времени выполнения для dividerColor типа цвет.

На самом деле, просто подклассы NSSplitView и переопределение -(void)dividerColor работает, но работает только для тонкого или толстого разделителя.

Я создал простой настраиваемый разделенный вид:

@interface CustomSplitView : NSSplitView
@property NSColor* DividerColor
@end

@implementation CustomSplitView
- (NSColor*)dividerColor {
  return (self.DividerColor == nil) ? [super dividerColor] : self.DividerColor;
}
@end

Затем в Интерфейсном Разработчике укажите пользовательский класс для вашего разделенного вида, который будет CustomSplitView и добавьте новый пользовательский атрибут времени выполнения с ключом path = DividerColor, type = Color и выберите нужный цвет сплиттера.

Исходя из ответа Палле, но с возможностью динамического изменения цвета в коде, я в настоящее время использую это решение (Swift 4):

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

Если ваш элемент управления splitview является частью NSSplitViewController, вы должны использовать что-то вроде этого:

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

В 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 ... но, похоже, это работает.

Один важный момент, который я нигде не упоминал, это то, что если вы переопределяете 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);
}
Другие вопросы по тегам