Наложение NSScroller поверх содержимого - PullRequest
7 голосов
/ 21 ноября 2010

Есть ли способ наложения NSScroller поверх содержимого представления прокрутки (как в iOS)? Я уже попробовал несколько подходов:

a) установка рамки представления содержимого представления прокрутки (NSClipView) для расширения в пределы скроллера

b) добавление объекта NSScroller в качестве подпредставления представления прокрутки (расположено там, где я хочу)

c) создание полностью настраиваемого представления скроллера и помещение его в качестве подпредставления (это сработало, но это означало бы, что мне нужно переписать все функциональные возможности NSScroller)

Воробей , кажется, успешно делает это, и, кажется, делает это через обычный подкласс NSScroller (видя, как он реагирует на настройки прокрутки, установленные в Системных настройках >> Внешний вид). Проблема не в том, чтобы нарисовать скроллер, а в том, чтобы он перекрывал содержимое.

Любой совет приветствуется: -)

Ответы [ 3 ]

7 голосов
/ 21 ноября 2010

Здесь вы можете установить пользовательский класс полос прокрутки.

После этого, переопределив -tile метод NSScrollView, вы разместите их правильно.

4 голосов
/ 18 февраля 2011

Вот мое решение: Создайте класс 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 в Интерфейсном Разработчике.

0 голосов
/ 07 января 2013

Я недавно выпустил RFOverlayScrollView, который должен решить вашу проблему:

Источник: https://github.com/rheinfabrik/RFOverlayScrollView

Сообщение в блоге: http://blog.rheinfabrik.de/blog/2013/01/01/introducing-rfoverlayscrollview/

...