Tengo un UITextViewque muestra un NSAttributedString. Esta cadena contiene palabras que me gustaría hacer tappable, de modo que cuando se tocan me devuelven la llamada para que pueda realizar una acción. Me doy cuenta de que UITextViewpuede detectar toques en una URL y devolver la llamada a mi delegado, pero estas no son URL.
Me parece que con iOS 7 y el poder de TextKit esto ahora debería ser posible, sin embargo, no puedo encontrar ningún ejemplo y no estoy seguro de por dónde empezar.
Entiendo que ahora es posible crear atributos personalizados en la cadena (aunque todavía no lo he hecho), y tal vez estos serán útiles para detectar si se ha tocado una de las palabras mágicas. En cualquier caso, todavía no sé cómo interceptar ese toque y detectar en qué palabra ocurrió el toque.
Tenga en cuenta que no se requiere compatibilidad con iOS 6 .
fuente

Detección de toques en texto atribuido con Swift
A veces para los principiantes es un poco difícil saber cómo configurar las cosas (de todos modos fue para mí), por lo que este ejemplo es un poco más completo.
Agregue un
UITextViewa su proyecto.Toma de corriente
Conecte el
UITextViewalViewControllercon una toma de corriente con nombretextView.Atributo personalizado
Vamos a hacer un atributo personalizado haciendo una Extensión .
Agregue un nuevo archivo swift con Archivo> Nuevo> Archivo ...> iOS> Fuente> Archivo Swift . Puedes llamarlo como quieras. Estoy llamando al mío NSAttributedStringKey + CustomAttribute.swift .
Pega el siguiente código:
Código
Reemplace el código en ViewController.swift con lo siguiente. Tenga en cuenta el
UIGestureRecognizerDelegate.Ahora, si toca la "w" de "Swift", debería obtener el siguiente resultado:
Notas
NSAttributedString.Key.foregroundColor(color de texto) que tiene un valor deUIColor.green.Estudio adicional
Esta respuesta se basó en varias otras respuestas a esta pregunta. Además de estos, ver también
fuente
myTextView.textStoragelugar demyTextView.attributedText.stringEsta es una versión ligeramente modificada, basada en la respuesta @tarmes. No pude hacer que la
valuevariable devuelva nada, peronullsin el ajuste a continuación. Además, necesitaba que se devolviera el diccionario de atributos completo para determinar la acción resultante. Hubiera puesto esto en los comentarios, pero no parece tener el representante para hacerlo. Disculpas de antemano si he violado el protocolo.Se debe usar un ajuste específico en
textView.textStoragelugar detextView.attributedText. Como todavía estoy aprendiendo programador de iOS, no estoy muy seguro de por qué, pero quizás alguien más pueda iluminarnos.Modificación específica en el método de manejo del grifo:
Código completo en mi controlador de vista
fuente
Hacer un enlace personalizado y hacer lo que quieras en el tap se ha vuelto mucho más fácil con iOS 7. Hay un muy buen ejemplo en Ray Wenderlich
fuente
UITextViewno detectaba enlaces incluso cuando lo había configurado para detectarlos a través de IB. (También lo había hecho no seleccionable)WWDC 2013 ejemplo :
fuente
Pude resolver esto bastante simple con NSLinkAttributeName
Swift 2
fuente
if URL.scheme == "cs"yreturn truefuera de laifdeclaración para queUITextViewpueda manejar loshttps://enlaces normales que se tocanEjemplo completo para detectar acciones en texto atribuido con Swift 3
Y luego puede ver la acción con el
shouldInteractWith URLmétodo de delegado UITextViewDelegate. Por lo tanto, asegúrese de haber configurado el delegado correctamente.Del mismo modo, puede realizar cualquier acción de acuerdo con sus requisitos.
¡¡Salud!!
fuente
Es posible hacer eso con
characterIndexForPoint:inTextContainer:fractionOfDistanceBetweenInsertionPoints:. Funcionará de manera algo diferente de lo que querías: tendrás que probar si un personaje seleccionado pertenece a una palabra mágica . Pero no debería ser complicado.Por cierto, recomiendo ver Introducing Text Kit de WWDC 2013.
fuente
Con Swift 5 e iOS 12, puede crear una subclase
UITextViewy anularpoint(inside:with:)algunas implementaciones de TextKit para que solo algunasNSAttributedStringsde ellas se puedan tocar.El siguiente código muestra cómo crear un
UITextViewmensaje que solo reaccione a los toques enNSAttributedStrings subrayados :InteractiveUnderlinedTextView.swift
ViewController.swift
fuente
Este podría funcionar bien con un enlace corto, multienlace en una vista de texto. Funciona bien con iOS 6,7,8.
fuente
Use esta extensión para Swift:
Agregue
UITapGestureRecognizera su vista de texto con el siguiente selector:fuente