Eu estou usando uma instância de UIWebView
para processar algum texto e colori-lo corretamente, ele fornece o resultado como HTML, mas em vez de exibi-lo no UIWebView
eu quero exibi-lo usando Core Text
com a NSAttributedString
.
Sou capaz de criar e desenhar o, NSAttributedString
mas não tenho certeza de como posso converter e mapear o HTML na string atribuída.
Entendo que, no Mac OS X, NSAttributedString
existe um initWithHTML:
método, mas isso foi apenas uma adição ao Mac e não está disponível para iOS.
Sei também que existe uma pergunta semelhante a essa, mas ela não tinha respostas. Embora tentasse novamente, verificaria se alguém criou uma maneira de fazer isso e, em caso afirmativo, se poderia compartilhá-lo.
Respostas:
No iOS 7, o UIKit adicionou um
initWithData:options:documentAttributes:error:
método que pode inicializar umNSAttributedString
uso de HTML, por exemplo:Em Swift:
fonte
Há uma adição de código aberto de trabalho em andamento ao NSAttributedString de Oliver Drobnik no Github. Ele usa o NSScanner para análise de HTML.
fonte
A criação de um NSAttributedString a partir do HTML deve ser feita no thread principal!
Atualização: Acontece que a renderização HTML NSAttributedString depende do WebKit, e deve ser executada no thread principal ou ocasionalmente trava o aplicativo com um SIGTRAP .
Novo log de falha da Relic:
Abaixo está uma extensão atualizada do Swift 2 String segura para threads :
Uso:
Resultado:
fonte
Extensão do inicializador Swift em NSAttributedString
Minha inclinação era adicionar isso como uma extensão ao
NSAttributedString
invés deString
. Eu tentei como uma extensão estática e um inicializador. Eu prefiro o inicializador, que é o que eu incluí abaixo.Swift 4
Swift 3
Exemplo
fonte
guard ... NSMutableAttributedString(data:...
portry self.init(data:...
(e adicionarthrows
à inicialização)Esta é uma
String
extensão escrita em Swift para retornar uma string HTML comoNSAttributedString
.Usar,
Acima, propositadamente, adicionei um unicode \ u2022 para mostrar que ele é renderizado corretamente.
Um trivial: a codificação padrão que
NSAttributedString
usa éNSUTF16StringEncoding
(não UTF8!).fonte
Fiz algumas modificações na solução de Andrew e atualize o código para Swift 3:
Este código agora usa o UITextView como
self
capaz de herdar sua fonte original, tamanho da fonte e cor do textoNota:
toHexString()
é extensão daquiExemplo de uso:
fonte
Versão Swift 3.0 Xcode 8
fonte
Swift 4
Uso
fonte
A única solução que você tem agora é analisar o HTML, criar alguns nós com os atributos point / font / etc, e combiná-los em um NSAttributedString. É muito trabalho, mas, se feito corretamente, pode ser reutilizável no futuro.
fonte
A solução acima está correta.
Mas o aplicativo wioll falhará se você estiver executando o ios 8.1,2 ou 3.
Para evitar a falha, o que você pode fazer é: execute isso em uma fila. Para que ele esteja sempre no thread principal.
fonte
O uso do NSHTMLTextDocumentType é lento e difícil de controlar estilos. Eu sugiro que você tente minha biblioteca chamada Atributika. Ele possui seu próprio analisador HTML muito rápido. Além disso, você pode ter qualquer nome de tag e definir qualquer estilo para eles.
Exemplo:
Você pode encontrá-lo aqui https://github.com/psharanda/Atributika
fonte
Swift 3 :
Experimente o seguinte :
E para usar:
fonte
Extensões úteis
Inspirado por esta discussão, um pod, e exemplo ObjC de Erica Sadun no iOS Gourmet Cookbook p.80, eu escrevi uma extensão
String
e emNSAttributedString
ir e voltar entre HTML simples cordas e NSAttributedStrings e vice-versa - no GitHub aqui , que Eu achei útil.As assinaturas são (novamente, código completo em um Gist, link acima):
fonte
com fonte
Como alternativa, você pode usar as versões derivadas e definir a fonte no UILabel após definir o atributoString
fonte
A conversão incorporada sempre define a cor do texto como UIColor.black, mesmo se você passar um dicionário de atributos com .forgroundColor definido para outra coisa. Para oferecer suporte ao modo DARK no iOS 13, tente esta versão da extensão em NSAttributedString.
fonte