Eu tenho um UITextView
que exibe um NSAttributedString
. Essa sequência contém palavras que eu gostaria de tornar tocáveis, de modo que, quando elas são tocadas, recebo uma chamada de volta para que eu possa executar uma ação. Sei que isso UITextView
pode detectar toques em um URL e ligar de volta para meu representante, mas esses não são URLs.
Parece-me que, com o iOS 7 e o poder do TextKit, isso agora deve ser possível, no entanto, não consigo encontrar nenhum exemplo e não sei por onde começar.
Entendo que agora é possível criar atributos personalizados na string (embora ainda não o tenha feito), e talvez sejam úteis para detectar se uma das palavras mágicas foi tocada? De qualquer forma, ainda não sei como interceptar esse toque e detectar em qual palavra o toque ocorreu.
Observe que a compatibilidade com o iOS 6 não é necessária.
fonte
Detectando toques no texto atribuído com o Swift
Às vezes, para iniciantes, é um pouco difícil saber como configurar as coisas (foi mesmo para mim), então esse exemplo é um pouco mais completo.
Adicione um
UITextView
ao seu projeto.Saída
Conecte
UITextView
aoViewController
com uma tomada chamadatextView
.Atributo personalizado
Vamos criar um atributo personalizado criando uma extensão .
Adicione um novo arquivo rápido com Arquivo> Novo> Arquivo ...> iOS> Origem> Arquivo Swift . Você pode chamá-lo como quiser. Estou chamando o meu NSAttributedStringKey + CustomAttribute.swift .
Cole o seguinte código:
Código
Substitua o código em ViewController.swift pelo seguinte. Observe o
UIGestureRecognizerDelegate
.Agora, se você tocar no "w" de "Swift", deverá obter o seguinte resultado:
Notas
NSAttributedString.Key.foregroundColor
(cor do texto) que tem um valor deUIColor.green
.Um estudo mais aprofundado
Esta resposta foi baseada em várias outras respostas para esta pergunta. Além destes, veja também
fonte
myTextView.textStorage
vez demyTextView.attributedText.string
Esta é uma versão ligeiramente modificada, baseada na resposta @tarmes. Não consegui fazer com que a
value
variável retornasse nada, masnull
sem o ajuste abaixo. Além disso, eu precisava que o dicionário de atributos completo retornasse para determinar a ação resultante. Eu teria colocado isso nos comentários, mas não parece ter o representante para fazê-lo. Desculpas antecipadamente se eu violar o protocolo.Ajuste específico é usar em
textView.textStorage
vez detextView.attributedText
. Como um programador de iOS ainda aprendendo, não tenho muita certeza do porquê disso, mas talvez alguém possa nos esclarecer.Modificação específica no método de manuseio de torneira:
Código completo no meu controlador de exibição
fonte
Tornar o link personalizado e fazer o que você deseja na torneira ficou muito mais fácil com o iOS 7. Há um exemplo muito bom em Ray Wenderlich
fonte
UITextView
não estava detectando links, mesmo quando eu o havia definido para detectá-los via IB. (Eu também tinha feito unselectable)Exemplo da WWDC 2013 :
fonte
Consegui resolver isso de maneira simples com NSLinkAttributeName
Swift 2
fonte
if URL.scheme == "cs"
ereturn true
fora daif
declaração para que oUITextView
pode lidar normaishttps://
links que são exploradasExemplo completo para detectar ações no texto atribuído com o Swift 3
Você pode capturar a ação com o
shouldInteractWith URL
método delegado UITextViewDelegate. Portanto, verifique se você definiu o delegado corretamente.Da mesma forma, você pode executar qualquer ação de acordo com sua exigência.
Felicidades!!
fonte
É possível fazer isso com
characterIndexForPoint:inTextContainer:fractionOfDistanceBetweenInsertionPoints:
. Funcionará de maneira um pouco diferente do que você queria - você terá que testar se um personagem digitado pertence a uma palavra mágica . Mas não deve ser complicado.BTW, eu recomendo assistir o Introducing Text Kit da WWDC 2013.
fonte
Com o Swift 5 e o iOS 12, você pode criar uma subclasse
UITextView
e substituirpoint(inside:with:)
alguma implementação do TextKit para fazer apenas algumasNSAttributedStrings
delas tocarem.O código a seguir mostra como criar um
UITextView
que reaja apenas aos toques emNSAttributedString
s sublinhados nele:InteractiveUnderlinedTextView.swift
ViewController.swift
fonte
Este pode funcionar bem com o link curto, com várias conexões em uma visualização de texto. Funciona bem com o iOS 6,7,8.
fonte
Use esta extensão para Swift:
Adicione
UITapGestureRecognizer
à sua exibição de texto com o seguinte seletor:fonte