2010-10-21 7 views
7

Ho già realizzato un'implementazione di una cella di scorrimento personalizzata che può disegnare utilizzando le immagini per la barra di scorrimento e la manopola. L'unico ostacolo che si frappone ora è questo, quando trascino velocemente la manopola, le immagini si incasinano. Ho postato una schermata.personalizzato NSSliderCell

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 riguardo al perché questo accada e come risolverlo sarà molto apprezzato, grazie!

risposta

13

Ok, quindi è capito. a quanto pare il cursore stava cercando di essere intelligente e disegnare solo dove è stata la manopola. quindi apparentemente devo invalidare il rect sempre sovrascrivendo setNeedsDisplayInRect nella classe slider.

#import "customSlider.h" 

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

Uomo, mi hai appena salvato, stavo cercando una soluzione a questo problema esatto per le ultime ore. Grazie! – eploko

+0

Nice catch man! :) Grazie – MetaImi

2

Rimuovi tutti i messaggi -lockFocus e -unlockFocus. Il framework si occuperà di impostare il contesto di disegno per voi prima che sia inviato -drawBarInside:flipped: o -drawKnob:.

Inoltre, non si dovrebbero creare oggetti all'interno di un metodo di disegno.

+0

Hey, grazie NSResponder, ho rimosso il blocco e sbloccato e rimosso anche la maggior parte del codice oggetto di creazione. tuttavia il problema persiste ancora. sto attualmente disegnando 3 immagini, barra sinistra, barra destra e la manopola. Succede solo quando muovo il mouse velocemente. Se lo trascino lentamente, disegna ok. – han

+0

Anche quando uso il metodo privato (che non mi piace molto) e ho commentato la barra di disegno a sinistra. sembra che lo stesso problema persista ancora se trascino rapidamente la manopola da destra a sinistra. E quando rilascio il mouse, gli spazi mancanti scompaiono e viene disegnata una bella immagine. – han

1

Ha, è un'altra storia. No, NSResponder ha ragione e dovresti rimuovere tutte le cose 'lockFocus', tuttavia, questo problema è il risultato della barra di scorrimento predefinita disegnata da NSSliderCell da qualche parte all'esterno di di drawBarInside: capovolto: capovolto. Ho affrontato questo problema non molto tempo fa.

Ecco la discussione e la soluzione: http://www.cocoabuilder.com/archive/cocoa/177288-preventing-nsslider-bar-from-drawing.html, in breve, è possibile eseguire l'override dell'intero drawCell: inView: oppure utilizzare un "trucco sporco" con l'override di un metodo privato. Io personalmente non piace hack, ma in questo caso ho fatto

- (BOOL)_usesCustomTrackImage { 
return YES; 
} 

Ed è risolto il problema per me

+0

Hey Gobra, sì, ho visto il tuo post prima. Ho provato questo metodo, ma purtroppo non funziona purtroppo :(tra il lato sinistro è un'immagine, non la barra predefinita.E 'stata un'immagine casuale che ho estratto dal mio computer per scopi di test. – han

+0

Oh sì, e anche se il il bar è lì, le mie immagini sembrano essere disegnate sopra e non mostra davvero il bar – han

4

Sono un principiante in Objective-c. Mi sono 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]; 

Siamo spiacenti per il cattivo inglese.

+0

Questa è la risposta corretta. –

+0

Ha funzionato!Ma non riesco a capire come funziona! Qualcuno potrebbe aiutare a spiegarlo? – YuDenzel

Problemi correlati