Question

J'ai accomplised sorte de mettre en œuvre une cellule de curseur personnalisé qui peut dessiner sur l'utilisation d'images pour la barre de défilement et le bouton. Le seul obstacle qui se trouve dans la voie est maintenant cela, quand je fais glisser le bouton rapidement, les images se foiré. J'ai posté une capture d'écran.

Capture d'écran

Voici le 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 je suis si proche. toute aide en ce qui concerne les raisons pour lesquelles cela se produit et comment le résoudre sera grandement appréciée, merci!

Était-ce utile?

La solution

Ok, donc il est compris. apparemment le curseur essayait d'être intelligent et d'en tirer que si le bouton a été. donc apparemment je dois invalider le rect tout le temps en remplaçant setNeedsDisplayInRect dans la classe de curseur.

#import "customSlider.h"

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

Autres conseils

Je suis un débutant en Objective-c. J'ai aussi rencontré ce problème! Voici la solution pour trouver que j'ai passé deux jours))) Sauvegarde et restauration des GraphicsState:

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

Désolé pour le mauvais anglais.

Supprimer tous les messages -lockFocus et -unlockFocus. Le cadre se chargera de la mise en place du cadre de dessin pour vous avant sont jamais envoyés -drawBarInside:flipped: ou -drawKnob:.

En outre, vous ne devrait pas créer des objets à l'intérieur d'une méthode de tirage.

Ha, il est une autre histoire. Non, NSResponder est juste et vous devez supprimer tous les trucs « lockFocus », cependant, cette question est le résultat de la barre de défilement par défaut dessiné par le quelque part NSSliderCell extérieur du drawBarInside: basculée: RENVERSÉ. J'ai fait face à cette question pas si il y a bien aussi.

Voici la discussion et la solution: http: //www.cocoabuilder.com/archive/cocoa/177288-preventing-nsslider-bar-from-drawing.html , bref, vous pouvez remplacer tout DrawCell: inView: ou utiliser un « truc sale hack » avec remplaçant une méthode privée. Personnellement, je ne aime pas hacks, mais dans ce cas, je l'ai fait

- (BOOL)_usesCustomTrackImage {
return YES;
}

Et il a résolu le problème pour moi

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top