Как нарисовать прозрачный NSScroller

Я делю NSScroller на подклассы, чтобы попытаться сделать его похожим на то, как выглядят "полосы прокрутки" на iOS. Я хочу, чтобы это было просто наложение, представляющее текущую позицию, которая рисуется над тем, что находится под ним. По какой-то причине, если я переопределю drawRect для скроллера, я получу границы, заполненные белым. Есть ли способ предотвратить это, чтобы я мог рисовать поверх того, чем закончился мой подкласс NSScroller?

Редактировать: рисование чистым цветом, кажется, приближает меня, но это рисунок "слишком четкий":P Он рисует прямо на рабочий стол, когда я просто хочу рисовать вниз в окно. Эта картина может сделать это более яснымальтернативный текст

Есть идеи?

5 ответов

Решение

Подклассы NSView выполняют рисование, начиная с drawRect. Если вы переопределите этот метод в подклассе, вы будете ответственны за выполнение всего рисования (будь то через ваши собственные методы или вызовы методов super.) Например, следующий код рисует только прокрутку nob и делает остальную часть рамка полосы прокрутки прозрачная.

- (void)drawRect:(NSRect)dirtyRect {

    // Do some custom drawing...
    [[NSColor clearColor] set];
    NSRectFill(dirtyRect);

    // Call NSScroller's drawKnob method (or your own if you overrode it)
    [self drawKnob];
  }

Это скорее подтверждение концепции, чем реальное предложение кода (не уверен, какое значение имеет выполнение этого минимального объема рисования для NSScroller.) NSScroller также имеет другие конкретные методы рисования, которые можно переопределить / вызвать из переопределенного drawRect: method (info доступно в документах Apple: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSScroller_Class/Reference/Reference.html)

Если вы пропустите все, кроме рисования ручки, вы можете получить скроллер без фона...

- (void) drawRect: (NSRect) dirtyRect
{
    [self drawKnob];
}

В качестве альтернативы вы можете использовать RFOverlayScrollView, хороший подкласс NSScroller, который прозрачен и автоматически скрыт; и опубликовано под лицензией MIT.

RFOverlayScrollView

RFOverlayScrollView - это подкласс NSScrollView, который показывает свой NSScroller в стиле iOS, даже когда мышь подключена.

Все, что вам нужно сделать, это установить scrollerView scrollerStyle к NSScrollerStyleOverlay.

Если вы просто хотите нарисовать поверх того, что рисует базовый класс, то вызовите [super drawRect:rect] прежде чем сделать свой собственный рисунок.

FWIW, я не уверен, что вы получите желаемый эффект, рисуя поверх рисунка по умолчанию NSScroller. Скроллеры в стиле iOS полупрозрачны. Если вы звоните супер drawRect:Вы получите синие скроллеры, которые будут видны через прозрачные скроллеры в стиле iOS. Вы, вероятно, хотите избежать вызова супер и просто нарисовать все самостоятельно.

Если вы хотите повторно использовать части чертежа, которые выполняет NSScroller, класс предоставляет множество методов для этого, таких как drawKnob, а также drawArrow:highlight:, так далее.

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