Tengo un UITextView
que 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 UITextView
puede 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
UITextView
a su proyecto.Toma de corriente
Conecte el
UITextView
alViewController
con 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.textStorage
lugar demyTextView.attributedText.string
Esta es una versión ligeramente modificada, basada en la respuesta @tarmes. No pude hacer que la
value
variable devuelva nada, peronull
sin 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.textStorage
lugar 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
UITextView
no 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 true
fuera de laif
declaración para queUITextView
pueda 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 URL
mé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
UITextView
y anularpoint(inside:with:)
algunas implementaciones de TextKit para que solo algunasNSAttributedStrings
de ellas se puedan tocar.El siguiente código muestra cómo crear un
UITextView
mensaje que solo reaccione a los toques enNSAttributedString
s 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
UITapGestureRecognizer
a su vista de texto con el siguiente selector:fuente