É trivial tornar os hiperlinks clicáveis em um arquivo UITextView
. Você acabou de definir a caixa de seleção "detectar links" na exibição no IB, e ele detecta os links HTTP e os transforma em hiperlinks.
No entanto, isso ainda significa que o que o usuário vê é o link "bruto". Arquivos RTF e HTML permitem que você configure uma sequência legível pelo usuário com um link "por trás" dela.
É fácil instalar o texto atribuído em uma exibição de texto (ou um UILabel
ou UITextField
, nesse caso.) No entanto, quando esse texto atribuído inclui um link, ele não pode ser clicado.
Existe uma maneira de tornar o texto legível pelo usuário clicável em um UITextView
, UILabel
ou UITextField
?
A marcação é diferente no SO, mas aqui está a ideia geral. O que eu quero é um texto como este:
Essa transformação foi gerada com o Face Dancer , Clique para visualizar na loja de aplicativos.
A única coisa que posso obter é esta:
Essa transformação foi gerada com o Face Dancer. Clique em http://example.com/facedancer para visualizar na loja de aplicativos.
fonte
Respostas:
Use NSMutableAttributedString .
Editar :
Não se trata diretamente da questão, mas apenas para esclarecer
UITextField
eUILabel
não suporta a abertura de URLs. Se você deseja usarUILabel
com links, pode verificar TTTAttributedLabel .Além disso, você deve definir
dataDetectorTypes
o valor do seuUITextView
paraUIDataDetectorTypeLink
ouUIDataDetectorTypeAll
para abrir URLs quando clicado. Ou você pode usar o método delegado, conforme sugerido nos comentários.fonte
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
NSURL
. ----[str addAttribute: NSLinkAttributeName value: [NSURL URLWithString:@"http://www.google.com"] range: NSMakeRange(0, str.length)];
NSAttributedString.h
UIKIT_EXTERN NSString * const NSLinkAttributeName NS_AVAILABLE(10_0, 7_0); // NSURL (preferred) or NSString
Achei isso realmente útil, mas eu precisava fazer isso em alguns lugares, então envolvi minha abordagem em uma extensão simples para
NSMutableAttributedString
:Swift 3
Swift 2
Exemplo de uso:
Objetivo-C
Acabei de atingir um requisito para fazer o mesmo em um projeto Objective-C puro, então aqui está a categoria Objective-C.
Exemplo de uso:
Verifique se o atributo de comportamento do NSTextField está definido como selecionável.
fonte
Acabei de criar uma subclasse de UILabel para abordar especialmente esses casos de uso. Você pode adicionar vários links facilmente e definir diferentes manipuladores para eles. Ele também suporta o destaque do link pressionado quando você toca no touchdown para obter feedback. Consulte https://github.com/null09264/FRHyperLabel .
No seu caso, o código pode ser assim:
Captura de tela de amostra (o manipulador está configurado para exibir um alerta em vez de abrir um URL neste caso)
fonte
- (void)setLinkForRange:(NSRange)range withLinkHandler:(void(^)(FRHyperLabel *label, NSRange selectedRange))handler;
. Por favor, consulte o leia-me na página do github.Pequena melhoria na solução da ujell: se você usa NSURL em vez de um NSString, pode usar qualquer URL (por exemplo, URLs personalizados)
Diverta-se!
fonte
Swift 4:
Swift 3.1:
fonte
Eu também tinha um requisito semelhante, inicialmente usei o UILabel e depois percebi que o UITextView é melhor. Eu fiz o UITextView se comportar como o UILabel, desativando a interação e a rolagem, e criei um método de categoria para
NSMutableAttributedString
definir o link para o texto, exatamente como o que Karl havia feito (+1 para isso).você pode usar o delegado abaixo para lidar com a ação
fonte
NSForegroundColorAttributeName
em um intervalo ondeNSLinkAttributeName
é aplicado não funciona. Não importa o quê, oslinkTextAttributes
deUITextView
são aplicados. FuncionaNSForegroundColorAttributeName
para você?linkTextAttributes
a mesma coisa? ou talveztintColor
? Você consegue fazer 2 links aparecerem em cores diferentes na mesma visualização de texto?Use o UITextView, que suporta links clicáveis. Crie uma sequência atribuída usando o seguinte código
Em seguida, defina o texto UITextView da seguinte maneira
Certifique-se de ativar o comportamento "Selecionável" do UITextView no XIB.
fonte
Selectable
é importante!O cerne da minha pergunta era que eu queria criar links clicáveis em exibições / campos / rótulos de texto sem precisar escrever um código personalizado para manipular o texto e adicionar os links. Eu queria que fosse orientado a dados.
Finalmente descobri como fazê-lo. A questão é que o IB não respeita os links incorporados.
Além disso, a versão iOS do
NSAttributedString
não permite inicializar uma sequência atribuída a partir de um arquivo RTF. A versão OS X doNSAttributedString
faz ter um inicializador que leva um arquivo RTF como entrada.NSAttributedString
está em conformidade com o protocolo NSCoding, para que você possa convertê-lo para / de NSDataCriei uma ferramenta de linha de comando do OS X que usa um arquivo RTF como entrada e gera um arquivo com a extensão .data que contém o NSData do NSCoding. Em seguida, coloco o arquivo .data no meu projeto e adiciono algumas linhas de código que carregam o texto na exibição. O código fica assim (este projeto estava no Swift):
Para aplicativos que usam muito texto formatado, crio uma regra de construção que informa ao Xcode que todos os arquivos .rtf em uma determinada pasta são de origem e os arquivos de dados são a saída. Depois de fazer isso, basta adicionar arquivos .rtf ao diretório designado (ou editar arquivos existentes) e o processo de compilação descobre que eles são novos / atualizados, executa a ferramenta de linha de comando e copia os arquivos no pacote de aplicativos. Funciona lindamente.
Eu escrevi uma postagem no blog com links para um projeto de amostra (Swift) demonstrando a técnica. Você pode vê-lo aqui:
Criando URLs clicáveis em um UITextField que é aberto no seu aplicativo
fonte
Exemplo Swift 3 para detectar ações em toques de texto atribuídos
https://stackoverflow.com/a/44226491/5516830
Da mesma forma, você pode adicionar qualquer ação que desejar com o
shouldInteractWith URL
método UITextFieldDelegate.Felicidades!!
fonte
A resposta rápida é usar UITextView em vez de UILabel. Você precisa ativar
Selectable
e desativarEditable
.Desative os indicadores de rolagem e salte.
Minha solução usando
NSMutableAttributedString
from html stringNSHTMLTextDocumentType
fonte
NSAttributedString
, defini-lo como oattributedText
meuUITextView
e os hiperlinks funcionam! Daria muito trabalho encontrar o intervalo de cada hiperlink e configurá-lo usando atributos.Eu escrevi um método, que adiciona um link (linkString) a uma string (fullString) com um determinado URL (urlString):
Você deve chamar assim:
fonte
Eu precisava continuar usando um UILabel puro, assim chamado pelo meu reconhecedor de toque (isso é baseado na resposta de malex aqui: Índice de caracteres no ponto de contato do UILabel )
fonte
Atualizar:
Havia duas partes principais da minha pergunta:
Acontece que o iOS 7 adicionou a capacidade de carregar o texto atribuído
NSData
.Criei uma subclasse personalizada
UITextView
que aproveita o@IBInspectable
atributo e permite carregar o conteúdo de um arquivo RTF diretamente no IB. Você simplesmente digita o nome do arquivo no IB e a classe personalizada faz o resto.Aqui estão os detalhes:
No iOS 7,
NSAttributedString
ganhou o métodoinitWithData:options:documentAttributes:error:
. Esse método permite carregar um NSAttributedString a partir de um objeto NSData. Você pode primeiro carregar um arquivo RTF no NSData e depois usá-loinitWithData:options:documentAttributes:error:
para carregá-lo na exibição de texto. (Observe que também há um métodoinitWithFileURL:options:documentAttributes:error:
que carrega uma sequência atribuída diretamente de um arquivo, mas esse método foi preterido no iOS 9. É mais seguro usar o métodoinitWithData:options:documentAttributes:error:
, que não foi preterido.Eu queria um método que me permitisse instalar links clicáveis nos meus modos de exibição de texto sem precisar criar nenhum código específico para os links que eu estava usando.
A solução que encontrei foi criar uma subclasse personalizada do UITextView que eu chamo
RTF_UITextView
e fornecer uma@IBInspectable
propriedade chamadaRTF_Filename
. A adição do@IBInspectable
atributo a uma propriedade faz com que o Interface Builder exponha essa propriedade no "Attributes Inspector". Em seguida, você pode definir esse valor no IB sem código personalizado.Também adicionei um
@IBDesignable
atributo à minha classe personalizada. o@IBDesignable
atributo diz ao Xcode que ele deve instalar uma cópia em execução da sua classe de visualização customizada no construtor Interface, para que você possa vê-la na exibição gráfica da sua hierarquia de visualizações. () Infelizmente, para esta classe, a@IBDesignable
propriedade parece ser esquisita. Funcionou quando o adicionei pela primeira vez, mas excluí o conteúdo de texto sem formatação da minha exibição de texto e os links clicáveis desapareceram e não consegui recuperá-los.)O código para o meu
RTF_UITextView
é muito simples. Além de adicionar o@IBDesignable
atributo e umaRTF_Filename
propriedade ao@IBInspectable
atributo, adicionei umdidSet()
método àRTF_Filename
propriedade OdidSet()
método é chamado sempre que o valor daRTF_Filename
propriedade é alterado. O código para odidSet()
método é bastante simples:Observe que, se a propriedade @IBDesignable não permitir a visualização confiável do texto com estilo no construtor de interface, será melhor configurar o código acima como uma extensão do UITextView em vez de uma subclasse personalizada. Dessa forma, você pode usá-lo em qualquer visualização de texto sem precisar alterar a visualização de texto para a classe personalizada.
Veja minha outra resposta se precisar oferecer suporte a versões do iOS anteriores ao iOS 7.
Você pode baixar um projeto de amostra que inclua essa nova classe no gitHub:
Projeto de demonstração DatesInSwift no Github
fonte
Basta encontrar uma solução sem código para o UITextView:
Ative a detecção-> opções de links, o URL e também o email serão detectados e clicáveis!
fonte
Versão rápida:
fonte
Use UITextView e defina dataDetectorTypes para Link.
como isso:
Se você deseja detectar um link, número de telefone, endereço etc.
fonte
http://somedomain/someurl?param=value
Uma rápida adição à descrição original de Duncan C sobre o comportamento de IB. Ele escreve: "É trivial tornar os hiperlinks clicáveis em um UITextView. Você acabou de definir a caixa de seleção" detectar links "na exibição no IB, e ele detecta os links http e os transforma em hiperlinks".
Minha experiência (pelo menos no xcode 7) é que você também precisa desmarcar o comportamento "Editável" para que os URLs sejam detectados e clicáveis.
fonte
Caso você esteja tendo problemas com o que @Karl Nosworthy e @esilver haviam fornecido acima, atualizei a extensão NSMutableAttributedString para sua versão Swift 4.
fonte
A excelente biblioteca do @AliSoftware
OHAttributedStringAdditions
facilita a adição de linksUILabel
aqui é a documentação: https://github.com/AliSoftware/OHAttributedStringAdditions/wiki/link-in-UILabelfonte
Se você deseja usar o NSLinkAttributeName em um UITextView, considere usar a biblioteca AttributedTextView. É uma subclasse UITextView que facilita muito o manuseio deles. Para mais informações, consulte: https://github.com/evermeer/AttributedTextView
Você pode fazer com que qualquer parte do texto interaja assim (onde textView1 é um UITextView IBoutlet):
E para lidar com hashtags e menções, você pode usar código como este:
fonte
se você deseja substring ativo no seu UITextView, pode usar meu TextView estendido ... é curto e simples. Você pode editá-lo como quiser.
resultado:
código: https://github.com/marekmand/ActiveSubstringTextView
fonte
PONTOS CHAVE:
fonte