Наложение NSScroller поверх содержимого
Есть ли способ наложить NSScroller поверх содержимого представления прокрутки (как в iOS)? Я уже попробовал несколько подходов:
а) установка рамки представления содержимого представления прокрутки (NSClipView) для расширения в пределы скроллера
б) добавление объекта NSScroller в качестве подпредставления представления прокрутки (расположен там, где я хочу)
c) создание полностью пользовательского представления скроллера и размещение его в качестве подпредставления (это сработало, но это означало бы, что мне нужно переписать все функциональные возможности NSScroller)
Воробей, кажется, успешно делает это, и он, кажется, делает это через обычный подкласс NSScroller (видя, как он реагирует на настройки прокрутки, установленные в Системных настройках >> Внешний вид). Проблема не в том, чтобы нарисовать скроллер, а в том, чтобы он перекрывал содержимое.
Любой совет приветствуется:-)
4 ответа
Здесь вы можете установить пользовательский класс ваших полос прокрутки.
После этого, переопределив -tile
метод NSScrollView
, вы разместите их правильно.
Вот мое решение: создайте класс MyScroller, который расширяет NSScroller
В MyScroller.m:
#import "MyScroller.h"
@implementation MyScroller
+(CGFloat) scrollerWidth{
return 10;
}
+(CGFloat) scrollerWidthForControlSize:(NSControlSize)controlSize{
return 10;
}
- (void) drawBackground:(NSRect) rect{
NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:0 yRadius:0];
[[NSColor whiteColor] set];
[path fill];
}
- (void)drawKnob{
[self drawBackground:[self rectForPart:0]];
[self drawBackground:[self rectForPart:1]];
[self drawBackground:[self rectForPart:2]];
[self drawBackground:[self rectForPart:4]];
[self drawBackground:[self rectForPart:5]];
[self drawBackground:[self rectForPart:6]];
NSRect knobRect = [self rectForPart:NSScrollerKnob];
NSRect newRect = NSMakeRect((knobRect.size.width - [MyScroller scrollerWidth]) / 2, knobRect.origin.y, [MyScroller scrollerWidth], knobRect.size.height);
NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:newRect xRadius:5 yRadius:5];
[[NSColor grayColor] set];
[path fill];
}
@end
Затем просто установите пользовательский класс для Scroller в Interface Builder.
Вы можете изменитьscrollerStyle
надNSScrollerView
контроль над.overlay
чтобы получить желаемый эффект наложения.
Это может отменить общесистемный параметр в Системных настройках для видимости полосы прокрутки. Чтобы «пережить» изменения настроек полосы прокрутки во время работы вашего приложения, вы должны соблюдатьNSScroller.preferredScrollerStyleDidChangeNotification
и повторно применить эффект наложения.
Я недавно выпустил RFOverlayScrollView, который должен решить вашу проблему:
Источник: https://github.com/rheinfabrik/RFOverlayScrollView
Сообщение в блоге: http://blog.rheinfabrik.de/blog/2013/01/01/introducing-rfoverlayscrollview/