Frage

Ich habe irgendwie accomplised eine benutzerdefinierte slider Zelle implementieren, die Verwendung von Bildern für die Scroll-Leiste und Knopf zieht über können. Das einzige Hindernis, das jetzt in der Art und Weise ist, ist dies, wenn ich den Knopf schnell ziehen, erhalten die Bilder durcheinander. Ich habe einen Screenshot veröffentlicht.

Screenshot

Hier ist der Code:

#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];
}

ah ich bin so nah. jede mögliche Hilfe in Bezug auf, warum dies geschieht und wie es zu lösen wird sehr geschätzt, Dank werden!

War es hilfreich?

Lösung

Ok, so ist es herausgefunden. offenbar wurde der Schieber versucht, schlau zu sein und nur zu ziehen, wo der Knopf war. so anscheinend muss ich durch zwingende setNeedsDisplayInRect in der Slider-Klasse Rect die ganze Zeit ungültig werden.

#import "customSlider.h"

@implementation customSlider
-(void)setNeedsDisplayInRect:(NSRect)invalidRect{
    [super setNeedsDisplayInRect:[self bounds]];
}
@end

Andere Tipps

Ich bin ein Anfänger in Objective-c. Ich lief auch in dieses Problem! Hier ist die Lösung zu finden, dass ich zwei Tage lang))) Speichern und Wiederherstellen von Graphics:

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

Sorry für schlechtes Englisch.

Entfernen Sie alle -lockFocus und -unlockFocus Nachrichten. Der Rahmen wird die Zeichnung Kontext der Einrichtung für Sie kümmern sich vor -drawBarInside:flipped: oder -drawKnob: jemals gesendet.

Außerdem sollten Sie keine Gegenstände in einem Streck-Verfahren werden zu schaffen.

Ha, es ist eine andere Geschichte. Nein, NSResponder richtig ist, und Sie sollen alle ‚lockFocus‘ Sachen entfernen, aber dieses Problem ist ein Ergebnis der Standard-Schiebebalken gezeichnet von der NSSliderCell irgendwo außerhalb des drawBarInside: blätterte: blättert. Ich habe dieses Problem konfrontiert nicht so weit vor als auch.

Hier ist die Diskussion und Lösung: http: INview: //www.cocoabuilder.com/archive/cocoa/177288-preventing-nsslider-bar-from-drawing.html , kurz gesagt, können Sie ganze DrawCell außer Kraft setzen oder einen "dirty Hack Trick" verwenden, um mit eine private Methode überschrieben. Ich persönlich mag es nicht, Hacks, aber in diesem Fall habe ich

- (BOOL)_usesCustomTrackImage {
return YES;
}

Und es löste das Problem für mich

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top