Cuando necesitas utilizar un DesktopTextArea en tus apps macOS es realmente simple: arrastra el control desde la Librería y suéltalo en el Layout Editor correspondiente a la ventana con container en el que lo quieras utilizar; y así obtendrás todo lo que ofrece sin la necesidad de tener que hacer nada más a partir del control nativo proporcionado por el framework subyacente de macOS. Pero, ¿qué hacer cuando necesitas que funcione de forma algo distinta como, por ejemplo, no aplicando los saltos de línea suaves? Sigue leyendo y te mostraré como hacerlo.
En macOS, el comportamiento del control DesktopTextArea es el ofrecido por el control nativo subyacente del framework de macOS; pero en aquellos escenarios en los que precises que su comportamiento se acerque más a lo que necesitas… ¡el uso de Declares resulta muy conveniente! Por ejemplo, el DesktopTextArea aplica por omisión saltos de línea suaves que se ajustan al propio ancho del control. Pero, en determinadas circunstancias, es probable que no quieres que haga precisamente eso, de forma que el texto mostrado por el control sea más legible línea a línea sin importar cuan larga sea cada una.
Si es eso lo que necesitas, sin tener que plantearte el uso de otro enfoque de la interfaz de usuario, entonces sólo tendrás que pegar el siguiente fragmento de código en el manejador de evento Opening correspondiente a la instancia de DesktopTextArea sobre la que quieras actuar:
#if TargetMacOS then // At this point we are getting really the handle to // the wrapping object: NSScrollView var tAObj as ptr = me.Handle Declare Function subviews lib "AppKit" selector "subviews" (obj as ptr) as ptr Declare Function objectAtIndex Lib "AppKit" selector "objectAtIndex:" (obj as ptr, index as integer) as ptr // We need to get the real NSTextView view that is set // inside the clip view set inside the NSScrollView var subViewsFromScroll as ptr = subviews(tAObj) var clipView as ptr = objectAtIndex(subViewsFromScroll, 1) var subViewsFromClipView as ptr = subviews(clipView) //…and here it is var textAreaView as ptr = objectAtIndex(subViewsFromClipView, 2) // At this point we have the real NSTextView from the wrapping NSScrollerView! Declare Function textContainer lib "AppKit" Selector "textContainer" (obj as ptr) as ptr Declare sub setWidthTracksTextView lib "AppKit" Selector "setWidthTracksTextView:" (obj as ptr, value as Boolean) Declare sub setContainerSize Lib "AppKit" selector "setContainerSize:" (obj as ptr, size as CGSize) Declare sub setMaxSize lib "AppKit" selector "setMaxSize:" (obj as ptr, size as CGSize) // Retrieving the NSTextContainer var tcObj as ptr = textContainer(textAreaView) setWidthTracksTextView(tcObj, false) var newSize as CGSize newSize.width = 100000 // Arbitrary value… we only need to set it to a really high value! newSize.height = 100000 // And setting a new max width size to it. setMaxSize(tAObj, newSize) // …and also using the same value for the size of the NSTextContainer setContainerSize(tcObj, newSize) #endif
Como puedes ver en el anterior código, estamos haciendo uso del tipo de dato CGSize. Se trata de una Estructura que se ha añadido a la ventana propiamente dicha (si bien probablemente quieras añadirla a un Módulo), y que cuenta con dos miembros:
- Width As Integer
- Height As Integer
Hemos de utilizar este tipo de dato / estructura porque es la esperada por un par de métodos en el framework de macOS, correspondientes a NSSCrollView y NSTextContainer, respectivamente.
Una vez que hayas añadido el código, activa la propiedad “Has Horizontal Scrollbar” para la instancia DesktopTextArea, utilizando para ello el Panel Inspector asociado, y ejecuta tu app. Verás como ya no se aplican los saltos de línea suaves en el texto.
¿Qué otros comportamientos personalizados estás usando en tus instancias de DesktopTextArea sobre macOS? Adelante y comparte el código para que otros usuarios también las puedan utilizar.
¡Feliz programación!