Как изменить цвет разделителя в 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);
}