Pregunta

He especie de accomplised la implementación de un control deslizante celular personalizado que puede dibujar sobre el uso de imágenes de la barra de desplazamiento y la perilla. El único obstáculo que se encuentra en el camino ahora es esto, cuando me arrastre el mando rápidamente, las imágenes llegar en mal estado. He publicado una captura de pantalla.

Imagen

Este es el código:

#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 estoy tan cerca. cualquier ayuda con respecto a por qué sucede esto y cómo solucionarlo será muy apreciada, gracias!

¿Fue útil?

Solución

Ok, así que ha resuelto. Al parecer, el deslizador estaba tratando de ser inteligente y sacar sólo cuando el mando ha sido. lo que al parecer tengo para invalidar la rect todo el tiempo reemplazando setNeedsDisplayInRect en la clase deslizador.

#import "customSlider.h"

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

Otros consejos

Soy un principiante en Objective-C. También me encontré con este problema! Aquí está la solución para encontrar que pasé dos días))) Guardar y restaurar GraphicsState:

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

Lo siento por mala Inglés.

Eliminar todos los mensajes -lockFocus y -unlockFocus. El marco se encargará de establecer el contexto de dibujo para que antes de -drawBarInside:flipped: o -drawKnob: se envían siempre.

Además, no debe ser la creación de objetos dentro de un método de sorteo.

Ha, que es otra historia. No, NSResponder es correcto y se debe eliminar toda la materia 'lockFocus', sin embargo, este problema es el resultado de la barra de desplazamiento predeterminado dibujado por el alguna parte NSSliderCell fuera de la drawBarInside: volteado: volteado. Me he enfrentado a este problema hasta ahora no se hace así.

Aquí está la discusión y solución: http: //www.cocoabuilder.com/archive/cocoa/177288-preventing-nsslider-bar-from-drawing.html , en definitiva, puede anular toda DrawCell: inView: o usar un "truco truco sucio" con sustituir un método privado. Yo personalmente no me gusta hacks, pero en este caso lo hice

- (BOOL)_usesCustomTrackImage {
return YES;
}

Y se resolvió el problema para mí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top