iphone ios uilabel core-text ctlineref

iphone - ¿Qué significa para una CTLine tener "acceso de cadena"?



ios uilabel (1)

La declaración "la línea no admite el acceso a cadenas de caracteres" se puede inferir en el sentido de que la línea de texto no se puede tratar como una secuencia de caracteres a la que puede acceder el índice de cada carácter.

Esto puede abrir una gran discusión sobre los caracteres visuales versus los caracteres no visuales, y los glifos versus los caracteres. Pero para simplificar la discusión, suponga que una línea de texto puede tener uno de los siguientes estados:

  1. más de cero caracteres (caracteres que se traducen a glifos o espacios en blanco dentro de la misma línea) están presentes en la línea de texto en cuestión
  2. No hay caracteres en la línea de texto que ocupen ningún "espacio"

Ahora para proporcionar algunas razones para esta inferencia.

La documentación de Apple proporciona una descripción del Kit de texto, sobre el cual se construye UILabel:

El marco UIKit incluye varias clases cuyo propósito es mostrar texto en la interfaz de usuario de una aplicación: UITextView, UITextField y UILabel, como se describe en Visualización de contenido de texto en iOS. Las vistas de texto, creadas a partir de la clase UITextView, están diseñadas para mostrar grandes cantidades de texto. El UITextView subyacente es un potente motor de diseño llamado Text Kit. Si necesita personalizar el proceso de diseño o necesita intervenir en ese comportamiento, puede usar el Kit de texto. Para cantidades más pequeñas de texto y necesidades especiales que requieren soluciones personalizadas, puede utilizar tecnologías alternativas de nivel inferior, como se describe en Tecnologías de manejo de texto de nivel inferior.

Text Kit es un conjunto de clases y protocolos en el marco UIKit que proporciona servicios tipográficos de alta calidad que permiten a las aplicaciones almacenar, diseñar y mostrar texto con todas las características de la composición tipográfica fina, como el kerning, las ligaduras, la ruptura de líneas y la justificación. . Text Kit está construido sobre Core Text, por lo que proporciona la misma velocidad y potencia. UITextView está totalmente integrado con el kit de texto; proporciona capacidades de edición y visualización que permiten a los usuarios ingresar texto, especificar atributos de formato y ver los resultados. Las otras clases del kit de texto proporcionan capacidades de almacenamiento y diseño de texto. La Figura 8-1 muestra la posición del Kit de texto entre otros marcos de texto y gráficos de iOS.

Figura 8-1 Posición del marco del kit de texto

El kit de texto le proporciona un control completo sobre la representación del texto en los elementos de la interfaz de usuario. Además de UITextView, UITextField y UILabel están construidos sobre Text Kit, y se integran perfectamente con animaciones, UICollectionView y UITableView. Text Kit está diseñado con una arquitectura completamente extensible orientada a objetos que admite subclasificación, delegación y un conjunto completo de notificaciones que permiten una personalización profunda.

La respuesta a la pregunta relacionada menciona varias clases como NSTextStorage , NSLayoutManager y NSTextContainer .

Tenga en cuenta que UILabel utiliza todas las clases anteriores para proporcionar el resultado final de mostrar texto en la vista UIView principal, que el usuario final ve en la pantalla. Un administrador de diseño (una instancia de NSLayoutManager ) coordina el flujo de datos entre la vista de texto, el contenedor de texto y el almacenamiento de texto, lo que da como resultado la visualización de los caracteres en la vista. El administrador de diseño asigna los caracteres a los glifos y determina qué líneas usar para colocar los glifos. El administrador de diseño también descubre cómo mostrar elementos como subrayado y tachado, que no son parte de los glifos.

Importante para esta discusión es el hecho de que el Administrador de diseño presenta líneas de texto. Si esa línea de texto es seleccionable, el usuario puede seleccionar caracteres visibles en la línea. En este caso particular, hay un "acceso de cadena" para la línea.

Un concepto similar es el método publicado en la solución a la pregunta relacionada:

func boundingRect(forGlyphRange glyphRange: NSRange, in container: NSTextContainer) -> CGRect

Devuelve un único rectángulo delimitador (en coordenadas de contenedor) que encierra todos los glifos y otras marcas dibujadas en el contenedor de texto dado para el rango de glifos dado, incluidos los glifos que se dibujan fuera de sus rectángulos de fragmentos de líneas y atributos de texto como el subrayado.

Finalmente, la discusión de referencia para la función CTLineGetOffsetForStringIndex habla sobre las compensaciones gráficas que son adecuadas para dibujar caretas personalizadas. Los caretes se pueden utilizar para mostrar puntos de inserción o selección de texto. Las compensaciones primarias y secundarias se pueden considerar como índices de inicio y fin de una cadena, una secuencia de caracteres. Si no hay una secuencia de caracteres para una línea dada, no puede haber caracteres seleccionados, caretes ni rango de glifos. Por lo tanto no hay "cadena de acceso".

Estoy tratando de resolver un problema grave con UILabel , y me he dado cuenta de la mayor parte del problema, excepto por una cosa: tengo un desafío para entender lo que significa que una CTLine tenga "acceso a cadenas".

El método que me gustaría usar es CTLineGetOffsetForStringIndex . Aquí hay un enlace a la documentación del método.

Aquí está la parte de la documentación que no entiendo (el énfasis es mío):

El desplazamiento primario a lo largo de la línea de base para charIndex, o 0.0 si la línea no admite el acceso a cadenas.

Cuando ejecuto este método, obtengo 0.0 vuelta, así que supongo que eso significa que la línea no admite el acceso a cadenas, pero ¿qué significa eso exactamente?