2012-04-05 10 views
5

Tengo una aplicación Cocoa, basada en documentos Mac OS X.Mac OS X: cómo forzar a un editor de campo a desplazarse en lugar de ajustar el texto?

Una característica que tengo en mi aplicación es una lista de elementos de texto que se pueden hacer doble clic para editar. Cuando el usuario hace doble clic en uno de los elementos de texto, coloco el campo de texto fieldEditor de la ventana actual sobre el elemento de texto al que se hace clic para permitir la edición.

Todo funciona bien excepto por un problema. No sé cómo hacer que el campo de texto fieldEditorclip + desplazarse en lugar de envolver su texto. Esto es lo que se ve actualmente como:

enter image description here

ver cómo el texto está envolviendo a una segunda línea? No quiero eso. Me gustaría que permanezca una línea que se desplaza (y aparece recortada).

Aquí es un ejemplo de que funcione correctamente en un elemento de la lista que tiene menos texto:

enter image description here

Esto es lo que estoy tratando en mi controlador de vista:

NSWindow *win = [listItemView window]; 
NSText *fieldEditor = [win fieldEditor:YES forObject:listItemView]; 
[fieldEditor setFont:[TDListItemView titleFont]]; 
[fieldEditor setAlignment:NSLeftTextAlignment]; 
[fieldEditor setDrawsBackground:YES]; 
[fieldEditor setBackgroundColor:[NSColor whiteColor]]; 
[fieldEditor setString:str]; 
[fieldEditor setDelegate:self]; 
[fieldEditor selectAll:nil]; 

if ([fieldEditor isKindOfClass:[NSTextView class]]) { 
    NSTextView *tv = (NSTextView *)fieldEditor; 
    NSMutableParagraphStyle *style = [[[tv defaultParagraphStyle] mutableCopy] autorelease]; 
    [style setLineBreakMode:NSLineBreakByClipping]; 
    [tv setDefaultParagraphStyle:style]; 
} 

CGRect r = [self fieldEditorRectForBounds:[listItemView bounds] index:idx]; // height here is 10.0 
[fieldEditor setFrame:r]; 
[fieldEditor setNeedsDisplay:YES]; 
[[self view] addSubview:fieldEditor]; 
[win makeFirstResponder:fieldEditor]; 

en cuenta que una parte en el medio: verifico si este fieldEditor es una instancia de NSTextView para llamar al método setDefaultParagraphStyle:. Este es mi intento de obtener el fieldEditor para recortar su texto - a través del valor NSLineBreakByClipping. No está teniendo ningún efecto. Y ni siquiera estoy seguro de que esto sea lo que debería hacer para obtener el fieldEditor para desplazarse en una línea.

También tenga en cuenta que la altura de rect que calculo en mi método -fieldEditorRectForBounds:index: es correcta y proporciona un rect que tiene el tamaño correcto para una sola línea de texto (14.0 píxeles en este caso).

¿Qué me hace falta para que el fieldEditor muestre una sola línea de texto desplazado/recortado?


También he intentado la adición de estas líneas en la sección media:

[[tv textContainer] setHeightTracksTextView:YES]; 
    [[tv textContainer] setWidthTracksTextView:YES]; 

Esto tiene el efecto deseado de cambiar el tamaño de la parte visible de la fieldEditor que es bueno. Pero la mala noticia es que no cambia el hecho de que el texto todavía está envuelto, en lugar de recortado + desplazado. :(


Esto parece estar relacionado con esta constante:

NSStringDrawingUsesLineFragmentOrigin 

que puede ser utilizado en el argumento de options::

-[NSAttributedString drawWithRect:options:attributes:] 

pero en mi caso, estoy trabajando desde un editor de campo NSText, no un NSAttributedString. No puedo entender cómo hacer este tipo de cosas con un editor de campo NSText.

Respuesta

3

Hmmm ... NSTextView se basa en un NSScrollView completamente por su comportamiento de desplazamiento. No estoy seguro de si hay más a esto que no estoy viendo, pero parece que la solución "histórica" ​​a su problema es ya sea para:

Usar un control diferente

Se puede utilizar un NSTextField editable en su configuración de etiqueta IB estándar con edición habilitada y desplazamiento seleccionado como el comportamiento. Hace todo el trabajo pesado por ti cuando está configurado correctamente, sin necesidad de perder el tiempo directamente con el editor de campo.

... o ...

tramposo

Slap el editor de campo en un NSScrollView de tamaño adecuado y configurado (permitir sólo de desplazamiento horizontal; no muestran los scrollers) de forma dinámica, luego quite la vista de desplazamiento cuando termine de editar.

+0

Tengo la sensación de que tienes razón. Esperaba que hubiera un método simple o dos que pudiera llamar para obtener el comportamiento que deseaba. Pero estoy cada vez más convencido de que tu respuesta aquí es correcta. –

+1

Si solo más personas en casa se dieran cuenta de que tengo razón (incluso cuando estoy equivocado), las cosas irían mucho mejor ... ;-) –

+1

¿Estas personas "en casa" * saben * qué tan alto eres StackOverflow la reputación es? Quizás deberían recordarlo;). Gracias por su consejo. Su opción número uno resultó ser un cambio relativamente simple, y me da el comportamiento que quiero. Gracias de nuevo. –

0
NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init]; 
[style setLineBreakMode:NSLineBreakByTruncatingHead]; 

NSMutableDictionary* attributes = [[NSMutableDictionary alloc] init]; 
[attributes setObject:style forKey:NSParagraphStyleAttributeName]; 

NSTextView* textView = [[NSTextView alloc] init]; 
[textView setTypingAttributes:attributes]; 
Cuestiones relacionadas