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.

Schermata

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!

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top