ios swift uilabel uitextview mongolian-vertical-script

¿Cómo se hace un texto vertical UILabel y UITextView para iOS en Swift?



mongolian-vertical-script (2)

Si va a rotar el texto, le sugiero que use un diseño de derecha a izquierda para que pueda omitir el paso de duplicación (y simplemente girar hacia el otro lado).

Debería poder establecer la propiedad de transform la etiqueta / vista de texto:

view.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(CGFloat(-M_PI_2)), view.bounds.width, view.bounds.height)

Debe traducir después de girar porque la vista gira alrededor de su origen (en la esquina superior izquierda).

La buena noticia es que los gestos y los toques se transforman al mismo tiempo que los píxeles, por lo que los controles continúan funcionando de la manera que espera.

Si llegaste a esta pregunta en función del título pero no estás interesado en mongol, es posible que estés buscando estas preguntas y respuestas:

He estado aprendiendo Swift para desarrollar aplicaciones de iOS para mongoles tradicionales . El problema es que el mongol tradicional se escribe verticalmente de arriba a abajo y de izquierda a derecha. Mi pregunta es ¿cómo visualizo el texto verticalmente y todavía tengo el trabajo de ajuste de línea?

Si te quedas conmigo por un minuto, intentaré explicar el problema más claramente. A continuación se muestra una imagen del tipo de vista de texto que me gustaría lograr. En caso de que el guión extranjero lo deseche, he incluido texto en inglés que sigue el mismo patrón. De hecho, si la aplicación tiene algún texto en inglés para mostrar, así es como debería verse.

Para un UILabel simple de una línea, una rotación de 90 grados en sentido horario funcionaría. Sin embargo, para un UITextView de varias líneas, necesito lidiar con el ajuste de línea. Si solo hago una rotación simple de 90 grados, lo primero que escribo terminará en la última línea.

Hasta ahora he hecho un plan que creo que puede superar este problema:

  1. Haga una fuente personalizada en la que todas las letras se reflejen verticalmente.
  2. Gire la vista de texto 90 grados en el sentido de las agujas del reloj.
  3. Refleje la vista de texto horizontalmente.

Eso debería encargarse del ajuste de texto.

Puedo hacer la fuente reflejada. Sin embargo, no sé cómo hacer la codificación Swift para la rotación y la duplicación de UITextView. He encontrado los siguientes enlaces que parecen dar pistas sobre partes de la solución, pero todos están en el Objetivo C y no en Swift.

Hay aplicaciones tradicionales de Mongolia en la tienda de aplicaciones (como this y this ), pero todavía no he encontrado a nadie que comparta su código fuente, por lo que no sé qué están haciendo detrás de escena para mostrar el texto. Planeo hacer que mi código sea de código abierto para que no sea tan difícil para otros en el futuro desarrollar aplicaciones para los varios millones de personas que leen el mongol tradicional. Cualquier ayuda que pueda brindar a este esfuerzo sería muy apreciada, no solo por mí sino también por el pueblo mongol. Incluso si no te conoces a ti mismo, votar esta pregunta para que sea más visible ayudaría.

Actualizar

La respuesta de @ sangonz sigue siendo una gran respuesta, pero la desmarqué temporalmente como la respuesta aceptada porque simplemente no podía hacer que todo funcionara. Específicamente:

  • Habilitar el desplazamiento (ya sea incrustando la vista personalizada en una vista de desplazamiento o subclasificando UIScrollView ). En el proyecto github, @sangonz dijo que esto debería ser fácil, pero no fue para mí.
  • Obtener un relevo (en lugar de estirar) las líneas de palabras en un cambio de orientación. Creo que esto no debería ser demasiado difícil de resolver con un poco más de investigación.
  • ¿Por qué las líneas de texto no llegan hasta el borde de la vista? Hay una gran brecha en la parte inferior.
  • Cómo desvincular el NSTextStorage de la vista vertical personalizada de la otra UITextView. (ver esta pregunta )

Hasta este punto , he estado usando el método original que propuse anteriormente, pero lo que realmente quiero es obtener algo como lo que @sangonz propuso que funcione.

También estoy considerando métodos alternativos como


Editar: Así es como finalmente lo hice.

Aquí hay una implementación muy básica en mi GitHub: Vertical-Text-iOS .

Nada lujoso, pero funciona. Finalmente tuve que mezclar TextKit y el procesamiento de imágenes. Echa un vistazo al código. Implica:

  1. NSTextContainer para obtener las dimensiones de texto correctas.
  2. Crear una UIView personalizada para representar el texto aplicando transformaciones afines a cada línea y renderizar usando NSLayoutManager para mantener todas las características de TextKit.

Forma TextKit

La forma correcta de mantener todos los beneficios del texto nativo (por ejemplo, resaltado, selección ...) es usar las API estándar de TextKit. El método que está proponiendo rompería todo eso o posiblemente resultaría en un comportamiento extraño.

Sin embargo, parece que TextKit en iOS todavía no admite la orientación vertical lista para usar, pero está preparado para eso. Como nota al margen, en OS X es algo compatible y podría llamar a textView.setLayoutOrientation(.Vertical) , pero aún tiene algunas limitaciones.

El protocolo NSTextLayoutOrientationProvider define una interfaz que proporciona la orientación predeterminada para el texto establecido en un objeto conforme, en ausencia de un atributo NSVerticalGlyphFormAttributeName explícito. La única clase UIKit que implementa esta interfaz es NSTextContainer , cuya implementación predeterminada devuelve NSTextLayoutOrientationHorizontal . Una subclase NSTextContainer que maneja texto vertical podría establecer esta propiedad en NSTextLayoutOrientationVertical para admitir la lógica de orientación del diseño personalizado.

Fuente: UIKit> Referencia de protocolo NSTextLayoutOrientationProvider para iOS

En conclusión , debe comenzar a subclasificar NSTextContainer , y tendrá que lidiar mucho con NSLayoutManager y NSTextContainer .

Forma de procesamiento de imagen personalizada

Si, por otro lado, decide seguir su representación de texto personalizada, le sugiero el siguiente enfoque.

  1. Representa el texto normal en una capa oculta con una fuente normal. Dele el tamaño correcto a su cuadro delimitador.
  2. Obtenga las propiedades del texto , principalmente la altura del texto y el interlineado.
  3. Procese la imagen dibujando cada línea en orden inverso de abajo hacia arriba como puede ver en la imagen a continuación. Debería obtener una nueva CGImage como resultado.
  4. Gire la imagen creando un UIImage y estableciendo el valor correcto de UIImageOrientation .
  5. Inserte esa imagen en un UIScrollView que solo permita el desplazamiento horizontal.

Tenga en cuenta que este método representa el texto completo, así que no lo use para textos muy largos. Si necesita hacer eso, deberá considerar un enfoque de mosaico. Vea WWDC 2013> 217 - Explorando vistas de desplazamiento en iOS 7 .

¡Buena suerte!

Actualización: (imagen del proyecto github)