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 fieldEditor
clip + desplazarse en lugar de envolver su texto. Esto es lo que se ve actualmente como:
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:
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
.
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. –
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 ... ;-) –
¿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. –