2010-12-07 16 views
6

Estoy tratando de obtener NSPopUpButton para procesar como un estándar NSButton con solo un conjunto de imágenes, pero sin tener suerte.¿Cómo puedo crear un NSPopUpButton que utiliza una imagen fija y sin flechas?

Al igual que el botón "+" en Mail.app:

Not clicked Clicked

Yo supongo que se hicieron con NSPopUpButton. Lo obvio que he probado es:

NSMenuItem *imageItem = [[[NSMenuItem alloc] init] autorelease]; 
[imageItem setImage:[NSImage imageNamed:NSImageNameAddTemplate]]; 

[[popUpButton cell] setUsesItemFromMenu:NO]; 
[[popUpButton cell] setMenuItem:imageItem]; 
[[popUpButton cell] setImagePosition:NSImageOnly]; 

Esto no muestra la imagen sin embargo, en lugar de sólo muestra un par de flechas (sospecho que están dibujados sobre el lugar donde sería la imagen). Llamar al [popUpButton setImage:...] tampoco hace nada.

¿Hay alguna forma documentada de hacerlo, o se reduce a alguna subclasificación personalizada?

Respuesta

2

En su ejemplo, sí, probablemente se implemente con un NSPopUpButton, pero en lugar de tratar de personalizar la celda, lo que realmente desea es un botón con -pullsDown: establecido en YES.

Esto es más fácil de configurar en el Interface Builder. Aún más fácil, utilice BWToolkit que cuenta con una barra de botones y botones personalizados específicamente para este propósito.

+0

Gracias, tienes razón, necesito 'pullsDown'. Sin embargo, con lo que realmente estaba luchando era ver mi imagen sin mostrar las flechas. La muestra de Menu Madness que Laurent menciona tiene algunos buenos ejemplos de pequeños trucos que necesito lograr. Estoy aprendiendo mucho de la construcción de esta aplicación Cocoa (que se ha convertido en una tarea mucho más grande de lo que pensé en un principio). – d11wtq

0

En Xcode 4.4 puede hacer todo esto usando el Generador de interfaces.

  1. arrastrar el estándar NSPopUpButton a la ventana,
  2. seleccionar el estilo como cualquier tipo de botón que desee,
  3. eligió el botón para tener una imagen, pero no ajusta la imagen,
  4. arrastre un NSImage del ícono que desee sobre el botón.

Encontré que usar el NSImage en lugar de configurar la imagen del botón funcionaba mucho mejor. Configurar la imagen del botón causó problemas al seleccionar elementos en el menú emergente.

4

Para evitar que el botón de visualización de la flecha:

[popupButton.cell setArrowPosition:NSPopUpNoArrow]; 
1

Aquí está el código que utilicé para finalmente conseguir este trabajo en Swift (el modelo de aplicación Menu Madness demostración de Apple).

func setUpButton() { 
    let popupButton = NSPopUpButton() 
    popupButton.translatesAutoresizingMaskIntoConstraints = false 
    popupButton.pullsDown = true 
    popupButton.bordered = false 
    let popupCell = popupButton.cell as! NSPopUpButtonCell 
    popupCell.arrowPosition = NSPopUpArrowPosition.NoArrow 
    popupButton.addItemWithTitle("") 
    var item = popupButton.itemAtIndex(0) 
    item?.image = NSImage(named: "add") 
    item?.onStateImage = nil 
    item?.mixedStateImage = nil 
    popupButton.addItemWithTitle("Item1") 
    item = popupButton.itemAtIndex(1) 
    item?.action = #selector(item1Pressed) 
    item?.target = self 
    popupButton.addItemWithTitle("Item2") 
    item = popupButton.itemAtIndex(2) 
    item?.action = #selector(item2Tapped) 
    item?.target = self 
    self.addSubview(popupButton) 

    // NOTE: These are auto layout helper methods I made that you won't have. 
    // Just note that here is where I set up the auto layout constraints. 
    popupButton.widthConstraint(40) 
    popupButton.heightConstraint(20) 
    popupButton.centerVerticallyInSuperview() 
    popupButton.trailingSpaceToSuperview(0) 
} 

// TO MAKE SURE ALL ITEMS ALWAYS VALID (WHAT I WANTED FOR MY USE CASE) 
override func validateMenuItem(menuItem: NSMenuItem) -> Bool { 
    return true 
} 

func item1Pressed() { 
    // do stuff 
} 

func item2Pressed() { 
    // do stuff 
} 

Asegúrese de que el ancho/alto del botón sea lo suficientemente grande para la imagen. Descubrí que había un relleno en el lado derecho del botón que cubría mi imagen pequeña hasta que hice que el botón se abriera lo suficiente para acomodar el misterioso relleno.

0

La respuesta de @Laurent Etiemble (ahora eliminada) nos ayudó a mí y al OP.

Tome un vistazo a this thread y la muestra de Apple Menu Madness: que contiene un código de ejemplo para poner una imagen en una NSPopUpButton.

Cuestiones relacionadas