5

I'm subclassing NSScroller to try to make it look similar to how "scrollbars" look on iOS. I want it to just be an overlay representing the current position that is drawn OVER what is under it. For whatever reason if I override drawRect for the scroller, I get the bounds filled with white. Is there any way to prevent this so that way I can just be drawing on top of what my NSScroller sub class is over?

Edit: Drawing with clear color seems to bring me close, but it is drawing "too clear" :P It's drawing right to the desktop, when I just want to be drawing down to the window. This picture might make it more clear alt text

Any ideas?

4

5 に答える 5

9

NSViewサブクラスは、drawRectから始まるすべての描画を実行します。サブクラスでそのメソッドをオーバーライドする場合は、すべての描画を行う責任があります(独自のメソッドを使用する場合でも、superのメソッドを呼び出す場合でも)。たとえば、次のコードはスクロールノブだけを描画し、残りの部分を作成します。スクロールバーのフレームは透明です。

- (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:メソッド(infoアップルのドキュメントから入手可能:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSScroller_Class/Reference/Reference.html

于 2010-11-15T05:38:34.500 に答える
5

ノブの描画以外をすべて省略すると、背景のないスクローラーを取得できます...

- (void) drawRect: (NSRect) dirtyRect
{
    [self drawKnob];
}
于 2012-04-02T03:44:28.407 に答える
0

基本クラスが描画するものの上に描画したいだけの場合[super drawRect:rect]は、独自の描画を行う前に呼び出してください。

FWIW、NSScrollerのデフォルトの描画の上に描画することで、希望する効果が得られるかどうかはわかりません。iOSスタイルのスクローラーは半透明です。スーパーを呼び出すとdrawRect:、透明なiOSスタイルのスクローラーを通して見える青いスクローラーが表示されます。あなたはおそらくスーパーを呼ぶのを避けて、あなた自身ですべてを描くことを望むでしょう。

NSScrollerが行う図面の一部を再利用する場合、クラスは、、、など、これを行うための多くのメソッドを提供しdrawKnobますdrawArrow:highlight:

于 2010-11-15T05:37:16.677 に答える