personalizzato NSSliderCell
-
10-10-2019 - |
Domanda
Non ho sorta di accomplised attuazione di una cella cursore personalizzato che può disegnare su utilizzando le immagini della barra di scorrimento e la manopola. L'unico ostacolo che è nel modo in cui ora è questo, quando mi trascina la manopola velocemente, le immagini vengono incasinato. Ho postato uno screenshot.
Ecco il codice:
#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 io sono così vicino. qualsiasi aiuto per quanto riguarda il motivo per cui questo accade e come risolverlo sarà molto apprezzato, grazie!
Soluzione
Ok, quindi è capito. a quanto pare il cursore stava cercando di essere intelligente e disegnare solo quando la manopola è stato. così apparentemente devo invalidare la rect tutto il tempo sovrascrivendo setNeedsDisplayInRect nella classe di scorrimento.
#import "customSlider.h"
@implementation customSlider
-(void)setNeedsDisplayInRect:(NSRect)invalidRect{
[super setNeedsDisplayInRect:[self bounds]];
}
@end
Altri suggerimenti
Sono un principiante in Objective-C. Ho anche imbattuto in questo problema! Ecco la soluzione per scoprire che ho trascorso due giorni))) Salvare e ripristinare GraphicsState:
[NSGraphicsContext restoreGraphicsState];
//...
[leftBarImage drawInRect:leftRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];
//...
[rightBarImage drawInRect:rightRect fromRect: NSZeroRect operation: NSCompositeSourceOver fraction:1];
[NSGraphicsContext saveGraphicsState];
Ci scusiamo per cattivo inglese.
Rimuovi tutti i messaggi -lockFocus
e -unlockFocus
. Il quadro si prenderà cura di impostare il contesto disegno per voi prima -drawBarInside:flipped:
o -drawKnob:
vengono mai inviate.
Inoltre, non dovrebbe essere la creazione di oggetti all'interno di un metodo draw.
Ha, è un'altra storia. No, NSResponder è giusto e si dovrebbe rimuovere tutta roba 'lockFocus', tuttavia, questo problema è il risultato della barra di scorrimento di default disegnato dal posto NSSliderCell fuori del drawBarInside: capovolto: capovolto. Ho affrontato questo problema non così lontano fa pure.
Ecco la discussione e la soluzione: http: //www.cocoabuilder.com/archive/cocoa/177288-preventing-nsslider-bar-from-drawing.html , in breve, è possibile ignorare tutto DrawCell: INview: o utilizzare un "trucco trucco sporco" con override un metodo privato. Io personalmente non mi piace hack, ma in questo caso ho fatto
- (BOOL)_usesCustomTrackImage {
return YES;
}
E ha risolto il problema per me