2011-04-21 24 views
5

Tengo una vista ns y uso dibujar rect para dibujar una imagen de fondo. También tiene 3 subvistas nsbuttons. El problema es que cada vez que el mouse está presionado sobre un botón, los otros desaparecen. Pero cuando elimino el método draw draw, esto no sucede. Así que supongo que esto tiene que ver con el método draw draw para dibujar imágenes.NSView drawRect ¿interfiere con las subvistas?

¿Cómo puedo evitar esto? Gracias.

EDIT: Bien, descubrí dónde está el problema. Básicamente, tengo un NSMenuItem, y estoy poniendo una vista dentro de él con 3 botones. Pero en NSMenu, en la parte superior, hay un relleno de 4 píxeles. Así que, básicamente, para eliminar que el relleno he utilizado la solución proporcionada aquí: Gap above NSMenuItem custom view

partir de la solución que hay una línea en el método drawRect:

[[NSBezierPath bezierPathWithRect:fullBounds] setClip]; 

el momento, me quito esta línea, y el botón compórtate adecuadamente. Pero luego, el relleno en la parte superior no desaparece.

Aquí es mi drawRect:

- (void) drawRect:(NSRect)dirtyRect { 

    [[NSGraphicsContext currentContext] saveGraphicsState]; 

    NSRect fullBounds = [self bounds]; 
    fullBounds.size.height += 4; 
    [[NSBezierPath bezierPathWithRect:fullBounds] setClip]; 

    NSImage *background = [NSImage imageNamed:@"bg.png"]; 
    [background drawInRect:fullBounds fromRect:NSZeroRect operation:NSCompositeCopy fraction:100.0]; 

    [[NSGraphicsContext currentContext] restoreGraphicsState]; 
} 
+0

¿Podría publicar su costumbre 'drawRect:'? –

+0

publicó el método drawRect. Gracias. – user635064

Respuesta

0

¿Estas seguro que esos botones son en realidad subvistas, y no sólo se coloca sobre la vista que se está dibujando?

+0

Gracias por la respuesta. Sí, estoy seguro, pero pensé que lo que está causando el problema es que no sé cómo solucionarlo. Por favor, lea mi pregunta original nuevamente porque la edité y le expliqué el problema en detalle. Gracias de nuevo. – user635064

3

La solución a la pregunta vinculada no incluye guardar y restaurar el estado de los gráficos, lo cual es una buena idea cuando se modifica uno que no se creó. Pruebe esto:

- (void)drawRect:(NSRect)dirtyRect { 
    // Save the current clip rect that has been set up for you 
    [NSGraphicsContext saveGraphicsState]; 
    // Calculate your fullBounds rect 
    // ... 
    // Set the clip rect 
    // ... 
    // Do your drawing 
    // ... 
    // Restore the correct clip rect 
    [NSGraphicsContext restoreGraphicsState] 
+0

Gracias por la respuesta, pero eso no funcionó. Además, creo que te refieres a saveGraphicsState y restoreGraphicsState? Gracias de nuevo. – user635064

+0

@ user635064: Lo dije en serio, sí, gracias; He estado haciendo errores tipográficos todo el día. Debería seguir usándolo aunque no solucione su problema directamente; evitará otros. –

+0

Gracias, haré. – user635064

Cuestiones relacionadas