Наложение 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/

Другие вопросы по тегам