2009-03-22 15 views
7

¿Hay alguna manera de tener un título NSButton para envolver cuando su ancho es más largo que el ancho del botón, en lugar de ser recortado?Ajustar NSButton título

Estoy tratando de tener un botón de opción con un texto que puede ser largo y tener varias líneas. Una manera en que pensé que funcionaba es tener un NSButton de tipo NSRadioButton pero no puedo hacer que varias líneas de texto funcionen.

Tal vez mi mejor alternativa es tener un NSButton seguido de un NSTextView con la función de delegarDown mouse en él activando el estado NSButton?

+0

Lea las Human Interface Guidelines de Apple, deben dar una idea de cómo hacer frente con la necesidad de elecciones descriptivas. – dreamlax

Respuesta

7

No creo que puedas. Tendría que subclasificar NSButtonCell para agregar soporte para esto.

Dicho esto, generalmente es una mala idea tener varias líneas de texto en un botón. A button label should concisely represent the action performed:

La etiqueta de un botón pulsador debe ser una frase verbo o verbo que describe la acción que realiza, guardar, cerrar, imprimir, borrar, cambiar la contraseña, y así sucesivamente. Si un botón pulsador actúa en una sola configuración, etiquete el botón lo más específicamente posible; "Elegir imagen ...", por ejemplo, es más útil que "Elegir ..." Debido a que los botones inician una acción inmediata, no debería ser necesario usar "ahora" (Escanear ahora, por ejemplo) en la etiqueta.

¿Qué estás tratando de hacer?

1

Estoy con Sören; Si necesita una descripción más larga, piense en utilizar una información sobre herramientas o en colocar texto descriptivo en un campo de texto envuelto utilizando la fuente del sistema pequeño debajo de las opciones de radio si el texto descriptivo tiene solo unas pocas líneas. De lo contrario, podría proporcionar más información en un documento de ayuda.

Sin embargo, encontrar la forma de decir lo que necesita decir de una manera concisa es su mejor opción.

+0

Necesito mostrar el texto asociado con cada opción de botón de radio "tal cual", cada una de ellas es una posible respuesta a una pregunta que se muestra en la parte superior, todas vienen de db y la reanudación no es una opción.Terminé agregando una vista de texto envuelto a la derecha de cada botón de opción y controlando la altura de forma dinámica. –

+0

Ah, contexto. ¡Eso tiene mucho más sentido! – Wevah

4

Bueno, esta es mi excusa para necesitar botones multilínea: estoy escribiendo un emulador para una IBM 701, completo con panel frontal, y, bendito sea, los diseñadores de ese panel frontal usaron etiquetas de varias líneas. Aquí está mi código. Solo tiene que subclase NSButtonCell (no NSButton), y solo se debe sobrescribir un método.

// In Xcode 4.6 (don't know about earlier versions): Place NSButton, then double-click it 
// and change class NSButtonCell to ButtonMultiLineCell. 

@interface ButtonMultiLineCell : NSButtonCell 

@end 

@implementation ButtonMultiLineCell 

- (NSRect)drawTitle:(NSAttributedString *)title withFrame:(NSRect)frame inView:(NSView *)controlView 
{ 
    NSAttributedString *as = [[NSAttributedString alloc] initWithString:[title.string stringByReplacingOccurrencesOfString:@" " withString:@"\n"]]; 
    NSFont *sysFont = [NSFont systemFontOfSize:10]; 
    NSMutableParagraphStyle *paragraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease]; 
    [paragraphStyle setAlignment:NSCenterTextAlignment]; 
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: 
     sysFont, NSFontAttributeName, 
     paragraphStyle, NSParagraphStyleAttributeName, 
     nil]; 
    NSSize textSize = [as.string sizeWithAttributes:attributes]; 
    NSRect textBounds = NSMakeRect(0, 0, textSize.width, textSize.height); 
    // using frame argument seems to produce text in wrong place 
    NSRect f = NSMakeRect(0, (controlView.frame.size.height - textSize.height)/2, controlView.frame.size.width, textSize.height); 
    [as.string drawInRect:f withAttributes:attributes]; 
    return textBounds; // not sure what rectangle to return or what is done with it 
} 

@end 
2

I'm increíblemente tarde, pero todavía me siento obligado a compartir lo que he encontrado.

Simplemente agregue un carácter de nueva línea antes y después del título del botón antes de asignarlo al botón real - ¡y voilà! Ahora se envuelve automáticamente.

La desventaja de este enfoque es que, por razones desconocidas para mí, las aplicaciones compiladas en una determinada versión de OS X cambian los títulos de los botones una línea hacia abajo cuando se ejecutan en las versiones más recientes.

1

Incluso más tarde, pero también me siento obligado a compartir. Puede establecer la propiedad attributeTitle de NSButton para lograr el ajuste manual.

En mi caso, yo quería que el título del botón para envolver si era mayor de 6 caracteres (Swift 3):

if button.title.characters.count > 6 { 
    var wrappedTitle = button.title 
    wrappedTitle.insert("\n", at: wrappedTitle.index(wrappedTitle.startIndex, offsetBy: 6)) 
    let style = NSMutableParagraphStyle() 
    style.alignment = .center 
    let attributes = [NSFontAttributeName: NSFont.systemFont(ofSize: 19), NSParagraphStyleAttributeName: style] as [String : Any] 
    button.attributedTitle = NSAttributedString(string: wrappedTitle, attributes: attributes) 
}