カスタムnsslidercell
-
10-10-2019 - |
質問
スクロールバーとノブの画像を使用して引き寄せることができるカスタムスライダーセルを実装することを完了しました。邪魔になっている唯一の障害はこれです。ノブをすばやくドラッグすると、画像が台無しになります。スクリーンショットを投稿しました。
これがコードです:
#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];
}
ああ、私はとても近いです。なぜこれが起こるのか、どのようにそれを解決するかについての助けは大歓迎です、ありがとう!
解決
わかりました、それが理解されています。どうやら、スライダーはスマートになり、ノブがあった場所にのみ描画しようとしていたようです。したがって、スライダークラスでsetNeedsdisplayInRectをオーバーライドすることにより、常に逆を無効にしなければなりません。
#import "customSlider.h"
@implementation customSlider
-(void)setNeedsDisplayInRect:(NSRect)invalidRect{
[super setNeedsDisplayInRect:[self bounds]];
}
@end
他のヒント
私は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];
英語が悪いと申し訳ありません。
すべてを削除します -lockFocus
と -unlockFocus
メッセージ。フレームワークは、以前にあなたのために描画コンテキストのセットアップの世話をします -drawBarInside:flipped:
また -drawKnob:
送信されます。
また、描画メソッド内でオブジェクトを作成しないでください。
ハ、それは別の話です。いいえ、NSResponderは正しいので、すべての「ロックフォーカス」のものを削除する必要がありますが、この問題は、NSSLiderCellによって描かれたデフォルトのスライダーバーの結果です。 外側 Drawbarinsideの:Flipp:Flipped。私もこの問題に直面しています。
これが議論と解決策です: http://www.cocoabuilder.com/archive/cocoa/177288-preventing-nsslider-bar-from-drawing.html 要するに、ドローセル全体をオーバーライドすることができます:Inview:または、プライベートメソッドをオーバーライドして「ダーティハックトリック」を使用します。私は個人的にはハックが好きではありませんが、この場合私はしました
- (BOOL)_usesCustomTrackImage {
return YES;
}
そして、それは私にとって問題を解決しました