UITextView con resaltado de syntax

¿Cómo resaltar la syntax en un UITextView , específicamente resaltado de syntax (y detección ) para Objective-C en el iPhone ?

Algunas de mis ideas sobre cómo hacer esto:

  • NSAttributedString . Ahora disponible en iOS 3.2 y superior. ¿Pero cómo pondría un NSAttributedString en un UITextView?
  • UIWebView . Superponerlo cuando el usuario termine de editar y colorear el texto con hojas de estilo CSS. ¿Pero cómo haría esto en un UIWebView , dándole el texto y luego colorearlo?

ACTUALIZACIÓN: desde iOS 7 y TextKit , el resaltado de syntax se ha vuelto fácil. No busques más aquí para una introducción (por mí).


Suponiendo que quiere un componente editable, no hay demasiada esperanza. Dando una visión general rápida, solo para asegurarme de que cubro todo:

  • UITextView : solo texto plano , sin forma (pública). Pero editable . No hay posibilidad de alterar nada, no hay posibilidad de obtener geometría, etc. Utiliza una vista web internamente. Cada párrafo es un

    , que es alterado por el motor de edición. Podrías cambiar el DOm allí pero eso es todo API privada. Todo privado, por lo tanto, no hay opción.

  • UIWebView : html , por lo que se puede diseñar, tener imágenes incrustadas, etc. Supongo (sin mirarlo) que esto es lo que usa la interfaz de usuario Three 20 antes mencionada. El problema: no se puede editar . No hay manera (pública) de evitar eso. No puedes obtener selecciones, acceder al DOM, etc. sin una API privada y muchos dolores de cabeza. La edición funcionaría como en UITextView pero requiere un nivel completamente nuevo de dolor de cabeza. Aún así: privado.
  • CoreText Framework: desde iOS 3.2 un muy buen motor de renderizado . Pero eso es todo. Puede diseñar y representar NSAttributesString s NSAttributesString . Sin embargo, no hay interacción del usuario. Sin selección de texto, sin entrada de texto, sin revisión ortográfica, sin reemplazos, sin iluminaciones, no no no no no. Solo renderizado. Y un poco de trabajo para hacerlo rápido en dispositivos viejos con textos largos.
  • UITextInput Protocol: permite la interacción con el teclado y captar la entrada de texto . También presenta reemplazos de texto básicos. Problema: solo entrada de texto, mal documentada. Sin selección de texto, etc. (ver arriba).

Aqui estamos. Dos componentes completamente funcionales que carecen de una función central y dos soluciones parciales que carecen del enlace faltante. Aquí están todos los enfoques viables que puedo idear:

  • Haga que el usuario edite un UITextView estilo y muestre el contenido con estilo en un UIWebView . Para este último puedes usar la cosa de Three20.
  • Construya el enlace faltante entre CoreText y UITextInput . Esto incluye, pero no se limita a, selección de texto, resaltado, colores de fondo, almacenamiento y administración de texto, eficiencia, revisión ortográfica, etc. Algunos de estos son proporcionados por los marcos del sistema pero aún así necesitan mucha integración.
  • Archive un error y espere a que aparezca una buena API pública (mi enfoque personal).
  • Convenza a Apple de permitir una API privada nuevamente y meterse con el DOM de UItextView .

El Grupo Omni ha adoptado el segundo enfoque y ha creado una vista de texto editable. Puede encontrarlo en el marco OmniUI . Sin embargo, esta implementación está lejos de ser perfecta. (al menos fue cuando la revisé por última vez hace unos meses). Intentaron mucho, pero aún no lograron llegar a la perfección de las manzanas en la interacción del usuario. Apple debe haber invertido al menos unos pocos años-hombre para hacer solo la interacción de la interfaz de usuario con la selección y edición de texto. No hay nada que hacer en casa, y como parece, incluso para las empresas como el grupo omni.

Hay un aspecto interesante de todo esto: iWork. Apple afirma no usar ninguna API privada en ellos. Pero la selección de texto es la misma que en el sistema operativo. Entonces deben haber copiado la fuente del marco en las aplicaciones. Enfoque muy honesto;)

Desde iOS 5 puedes usar un UIWebView y establecer contenteditable="true" en un div en él. Esto hace que UIWebView abra un teclado y permita al usuario ingresar texto directamente en el DOM. A continuación, puede escribir una aplicación web que resalte la syntax. Puede comunicarse con la aplicación Cocoa con URL personalizadas.

El único problema que tengo es que parece que no tienes la corrección ortográfica.

JTextView es un reemplazo UITextView que admite un NSAttributedString texto NSAttributedString . Permite la visualización de texto enriquecido pero está incompleto.

No sé mucho sobre la detección de syntax, pero si desea tener múltiples estilos en el mismo UITextView, entonces Three 20 UI es algo que debe ver en

Aquí hay otra pregunta que puede relacionarse con usted: ¿Cuál es la mejor manera de implementar el resaltado de syntax del código fuente en Cocoa ? No estoy seguro de si es Mac o iPhone, pero creo que si combinas esto y Three20, puedes tener el tuyo en iPhone. Buena suerte

Si alguien todavía está buscando una solución completa para esto, conozco dos bibliotecas que ofrecen esto:

  • Highlightr : una biblioteca Swift para el resaltado de syntax, admite cientos de idiomas pero usa JS como back-end. Sin embargo, es lo suficientemente rápido para la edición en vivo. ( Descargo de responsabilidad : soy el creador de esta biblioteca).
  • SyntaxKit : una solución nativa de Sam Soffes , pero en las primeras etapas de desarrollo. Debería admitir cualquier syntax de TextMate en el futuro. Este debería ser el camino a seguir cuando la biblioteca esté lo suficientemente madura.