8

スクロールバーとノブの画像を使用して描画できるカスタムスライダーセルの実装をある程度実行しました。現在邪魔になっている唯一の障害はこれです。ノブをすばやくドラッグすると、画像が台無しになります。スクリーンショットを投稿しました。

スクリーンショット

コードは次のとおりです。

#import "customSliderCell.h"
@implementation customSliderCell
- (void)drawKnob:(NSRect)knobRect {

    NSImage * knob = knobImage;
 [[self controlView] lockFocus];
 [knob
 compositeToPoint:NSMakePoint(knobRect.origin.x,knobRect.origin.y+knobRect.size.height)
 operation:NSCompositeSourceOver];

[[self controlView] unlockFocus];
}
- (void)drawBarInside:(NSRect)rect flipped:(BOOL)flipped {
rect.size.height = 8;

    NSRect leftRect = rect;
    leftRect.origin.x=0;
    leftRect.origin.y=2;
    leftRect.size.width = knobrect.origin.x + (knobrect.size.width);
    [leftBarImage setSize:leftRect.size];
    [leftBarImage drawInRect:leftRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];

    NSRect rightRect = rect;
    rightRect.origin.x=0;
    rightRect.origin.y=2;
    rightRect.origin.x = knobrect.origin.x;
    [rightBarImage setSize:rightRect.size];
    [rightBarImage drawInRect:rightRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];
}

ああ、私はとても近いです。なぜこれが起こるのか、そしてそれをどのように解決するのかについての助けは大歓迎です、ありがとう!

4

4 に答える 4

13

わかりました。どうやらスライダーは賢く、ノブがあった場所だけを描画しようとしていたようです。どうやら、スライダー クラスで setNeedsDisplayInRect をオーバーライドして、四角形を常に無効にする必要があるようです。

#import "customSlider.h"

@implementation customSlider
-(void)setNeedsDisplayInRect:(NSRect)invalidRect{
    [super setNeedsDisplayInRect:[self bounds]];
}
@end
于 2010-11-11T08:56:39.293 に答える
4

私はObjective-cの初心者です。私もこの問題に遭遇しました!これが私が2日を費やしたことを見つけるための解決策です)))GraphicsStateを保存して復元します:

[NSGraphicsContext restoreGraphicsState];
//...
[leftBarImage drawInRect:leftRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];
//...
[rightBarImage drawInRect:rightRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];
[NSGraphicsContext saveGraphicsState];

英語が下手でごめんなさい。

于 2012-08-01T10:08:27.000 に答える
2

-lockFocusおよびメッセージをすべて削除し-unlockFocusます。-drawBarInside:flipped:フレームワークは、送信される前または 送信される前に、描画コンテキストを設定します-drawKnob:

また、描画メソッド内でオブジェクトを作成しないでください。

于 2010-10-21T10:40:10.980 に答える
1

ハ、それは別の話です。いいえ、NSResponderは正しいので、すべての'lockFocus'のものを削除する必要がありますが、この問題は、drawBarInside:flipped:flippedの外側のどこかにNSSliderCellによって描画されたデフォルトのスライダーバーの結果です。私もそう遠くない昔にこの問題に直面しました。

議論と解決策は次のとおりです。http://www.cocoabuilder.com/archive/cocoa/177288-preventing-nsslider-bar-from-drawing.htmlつまり、drawCell:inView:全体をオーバーライドするか、「ダーティプライベートメソッドをオーバーライドする「ハックトリック」。私は個人的にハックが好きではありませんが、この場合はハックしました

- (BOOL)_usesCustomTrackImage {
return YES;
}

そしてそれは私にとって問題を解決しました

于 2010-10-21T14:35:40.333 に答える