cocoa word-wrap nstextview

cocoa - ¿Cómo deshabilitar el ajuste de texto de NSTextView?



word-wrap (4)

NSTextView hace ajuste de palabra por defecto. ¿Cómo puedo deshabilitar esto? Estoy haciendo un visor de código JSON, así que tengo que deshabilitar esto.


Encontré que esta solución previno el ajuste de línea, pero tuvo algunas consecuencias desafortunadas de dibujo para el NSTextView. El problema era que cuando el NSPanel que contenía las vistas de texto se arrastraba para ser más ancho que las líneas de texto, los límites rectos del NSView se ajustaban (por el administrador de diseño subyacente) para que fueran un poco más largos que el texto, revelando los antecedentes del NSPanel. No es lo que tenía en mente ...

Mis soluciones fueron habilitar el cambio de tamaño en NSPanel, restringirlo a la horizontal mediante el establecimiento de tamaños mínimo y máximo y desactivar el cambio de tamaño horizontal para la vista de texto en sí:

// some fragments from the creation of the NSPanel // resizable NSPanel created mMonitorPanel = [[NSPanel alloc] initWithContentRect: monitorRect styleMask: (NSTitledWindowMask| NSMiniaturizableWindowMask | NSResizableWindowMask) backing: NSBackingStoreBuffered defer: NO]; // constrain resizing to horizontal only, with obvious limits ... [mMonitorPanel setContentMaxSize: NSMakeSize(1000, 600)]; [mMonitorPanel setContentMinSize: NSMakeSize(300, 600)]; // a fragment from the init that creates an instance of a subclass of NSTextView ... [self setVerticallyResizable: NO]; [self setHorizontallyResizable: NO]; // rather than YES as prior code snippet // the rest is the same as above [[self textContainer] setContainerSize: NSMakeSize(FLT_MAX, FLT_MAX)]; [[self textContainer] setWidthTracksTextView: NO];

Esto da como resultado un panel de monitor que se puede redimensionar horizontalmente, no se ajusta a las líneas y se dibuja correctamente en su envolvente NSPanel.

Espero que esto ayude a alguien, ¡no sé dónde estaría sin todas las buenas soluciones que he encontrado en este sitio!


La forma más sencilla es en Interface Builder, en el inspector simplemente cambie el menú desplegable.


Las tres líneas dadas en la respuesta aceptada solo por Eonil no funcionaron para mí, la vista de texto resultante no se desplazó horizontalmente y, por lo tanto, no había manera de ver la parte recortada de las líneas largas.

El fragmento de código completo del hilo de cocoa-dev referenciado produjo los resultados correctos. Específicamente, este conjunto de pasos:

NSSize layoutSize = [textView maxSize]; layoutSize.width = layoutSize.height; [textView setMaxSize:layoutSize]; [[textView textContainer] setWidthTracksTextView:NO]; [[textView textContainer] setContainerSize:layoutSize];


Obtuve la solución en: http://lists.apple.com/archives/cocoa-dev/2008/May/msg02396.html

Debe hacer que el ancho máximo de NSTextView sea un número muy grande para que esto funcione correctamente. (Solo copie la altura máxima) Y habilite el desplazamiento horizontal de NSScrollView, que es una vista de supervisión de NSTextView. Vea estas imágenes:

http://www.flickr.com/photos/47601728@N06/4759470529/

http://www.flickr.com/photos/47601728@N06/4759470533/

Actualizar

Descubrí que mi código de ejemplo anterior no era suficiente para que funcionara correctamente. (¿Por la versión del SDK?) También aquí está mi fragmento de código fuente completo que deshabilita el ajuste de palabras en OSX 10.8 SDK.

[self setMaxSize:CGSizeMake(FLT_MAX, FLT_MAX)]; [self setHorizontallyResizable:YES]; [[self textContainer] setWidthTracksTextView:NO]; [[self textContainer] setContainerSize:CGSizeMake(FLT_MAX, FLT_MAX)];

Actualización 2

Ahora Apple proporciona una guía oficial para crear NSTextView correctamente. Espero que esto ayude.

Actualización 3

Publiqué un proyecto de ejemplo en Github . Consulte esta página para una implementación específica: https://github.com/Eonil/CocoaProgrammaticHowtoCollection/blob/master/ComponentUsages/TextView/ExampleApplicationController.swift?ts=4

Aquí hay un fragmento de código del proyecto de ejemplo.

if wordwrap { /// Matching width is also important here. let sz1 = scroll1.contentSize text1.frame = CGRect(x: 0, y: 0, width: sz1.width, height: 0) text1.textContainer!.containerSize = CGSize(width: sz1.width, height: CGFloat.max) text1.textContainer!.widthTracksTextView = true } else { text1.textContainer!.widthTracksTextView = false text1.textContainer!.containerSize = CGSize(width: CGFloat.max, height: CGFloat.max) }