2010-09-17 25 views

Respuesta

7

Necesitaba tener un fondo de botón personalizado, así es como lo hice. Hice una subclase NSButton y drawRect hizo caso omiso de método:

- (void)drawRect:(NSRect)dirtyRect 
{ 
    // My buttons don't have a variable height, so I make sure that the height is fixed 
    if (self.frame.size.height != 22) { 
     self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, 
           22.0f); 
    } 
    // 
    switch (self.state) { 
      // Onstate graphics 
     case NSOnState: 
      NSDrawThreePartImage(self.bounds, 
           [NSImage imageNamed:@"btnmain_lb_h.png"], [NSImage imageNamed:@"btnmain_bg_h.png"], [NSImage imageNamed:@"btnmain_rb_h.png"], 
           NO, NSCompositeSourceAtop, 1.0, NO); 
      // Offstate graphics 
     default: 
     case NSOffState: 
      NSDrawThreePartImage(self.bounds, 
           [NSImage imageNamed:@"btnmain_lb.png"], [NSImage imageNamed:@"btnmain_bg.png"], [NSImage imageNamed:@"btnmain_rb.png"], 
           NO, NSCompositeSourceAtop, 1.0, NO); 
      break; 
    } 

    [super drawRect:dirtyRect]; 
} 

Entonces podría poner los botones usando el Interface Builder, y para obtener los gráficos personalizados acabo de cambiar la clase de mi nueva subclase.

1

NSButton no tiene los mismos métodos de conveniencia para imágenes de fondo como UIButton (lo cual es extraño y espero que Apple cubra esa brecha). Necesitarás crear un botón personalizado, mi subclasificación NSView y manejar el ancho y las esquinas variables tú mismo. No creo que sea fácil, pero tampoco creo que sea terriblemente difícil.

+0

La vergüenza ¿verdad? :) No es como el método de conveniencia en UIButton realmente es tan conveniente. – BadPirate

2

Esto funcionó perfectamente bien para mí:

[self.addBuddyCommitButton.cell setBezelStyle:NSRoundedBezelStyle]; 
+0

después de anular drawBezelWithFrame: (NSRect) frame inView: (NSView *) controlView ¡funciona! – tomeron11