UITextView com Realce de Sintaxe

Como fazer realce de syntax em um UITextView , especificamente realce de syntax (e detecção ) para Objective-C no iPhone ?

Algumas das minhas idéias de como fazer isso:

  • NSAttributedString . Agora disponível no iOS 3.2 e superior. Mas como eu colocaria um NSAttributedString em um UITextView?
  • UIWebView . Sobreponha quando o usuário terminar de editar e colorir o texto com folhas de estilo CSS. Mas como eu faria isso em um UIWebView , dando-lhe o texto e colorindo-o?

ATUALIZAÇÃO: Desde o iOS 7 e TextKit , o destaque da syntax tornou-se fácil. Não procure mais do que aqui para uma introdução (por mim).


Supondo que você queira um componente editável, não há muita esperança. Dando uma rápida visão geral, só para ter certeza de cobrir tudo:

  • UITextView : texto simples , sem contorno (público). Mas editável . Não há chance de alterar nada, nenhuma chance de obter geometry, etc. Usa uma visualização da Web internamente. Cada parágrafo é um

    , que é alterado pelo mecanismo de edição. Você pode alterar o DOm, mas isso é tudo API privado. Tudo privado, daí nenhuma opção.

  • UIWebView : html , para que possa ser estilizado, ter imagens incorporadas, etc. Eu acho (sem olhar para ele) que isso é o que o anteriormente mencionado Three 20 UI usa. O problema: não pode ser editado . Não há maneira (pública) em torno disso. Você não pode obter seleções, acessar o DOM, etc sem API privada e muita dor de cabeça. A edição funcionaria como no UITextView, mas requeria um novo nível de dor de cabeça. Ainda assim: privado.
  • CoreText Framework: Desde o iOS 3.2, um motor de renderização muito bom. Mas é isso. Pode diretamente layout e processar NSAttributesString s. No entanto, não há interação do usuário. Sem seleção de texto, sem input de texto, sem verificação ortográfica, sem substituições, sem realces, não não não não não. Apenas renderizando. E um pouco de trabalho para torná-lo rápido em dispositivos antigos com textos longos.
  • Protocolo UITextInput : Permite interação com o teclado e captura de texto . Também possui substituições básicas de texto. Problema: input de texto apenas, mal documentada. Nenhuma seleção de texto, etc (veja acima).

Então aqui estamos nós. Dois componentes totalmente funcionais que não possuem uma function central e duas soluções parciais que não possuem o elo perdido. Aqui estão todas as abordagens viáveis ​​que posso propor:

  • Faça o usuário editar um UTextView sem estilo e exibir o conteúdo estilizado em um UIWebView . Para este último você pode usar a coisa Three20.
  • Construa o elo perdido entre o CoreText e o UITextInput . Isso inclui, mas não está limitado a, seleção de texto, realce, colors de fundo, armazenamento e gerenciamento de texto, eficiência, verificação ortográfica, etc. Alguns deles são fornecidos por estruturas de sistema, mas ainda precisam de muita integração.
  • Arquive um bug e aguarde a chegada de uma boa API pública (minha abordagem pessoal).
  • Convencer a Apple a permitir a API privada novamente e mexer no DOM do UItextView .

O Omni Group adotou a segunda abordagem e criou uma textview editável. Você pode encontrá-lo na estrutura do OmniUI . No entanto, esta implementação está longe de ser perfeita. (pelo menos foi quando eu verifiquei pela última vez há alguns meses). Eles tentaram muito, mas ainda não conseguiram chegar à perfeição da Apple na interação do usuário. A Apple deve ter investido pelo menos alguns homens-anos para fazer apenas a interação da interface do usuário com a seleção e edição de texto. Nada a ser feito em casa, e como parece até para empresas como o grupo omni.

Há um aspecto interessante para tudo isso: o iWork. A Apple afirma não usar nenhuma API privada neles. Mas a seleção de texto é a mesma que no sistema operacional. Então eles devem ter copiado a fonte do framework para os aplicativos. Abordagem muito honesta;)

Desde o iOS 5, você pode usar um UIWebView e definir contenteditable="true" em um div nele. Isso faz com que o UIWebView abra um teclado e permita que o usuário insira texto diretamente no DOM. Você pode então escrever um webapp que faça o realce de syntax. Você pode se comunicar com o aplicativo do cacau com URLs personalizados.

O único problema que tenho é que você não consegue obter a verificação ortográfica.

O JTextView é um substituto do UITextView que suporta um armazenamento de texto NSAttributedString . Permite a exibição de rich text, mas está incompleta.

Eu não sei muito sobre a detecção de syntax, mas se você quiser ter vários estilos no mesmo UITextView, então Three 20 UI é uma coisa que você deve olhar

Aqui está outra pergunta que pode estar relacionada a você: Qual é a melhor maneira de implementar o realce de syntax do código-fonte no Cocoa . Eu não tenho certeza se é o Mac ou o iPhone, mas acho que se você combinar isso com o Three20, então você pode ter o seu próprio no iPhone. Boa sorte

Se alguém ainda está procurando uma solução completa para isso, eu conheço duas bibliotecas que fornecem isso:

  • Highlightr : Uma biblioteca Swift para realce de syntax, suporta centenas de idiomas, mas usa o JS como backend. É rápido o suficiente para edição ao vivo, no entanto. ( Isenção de responsabilidade : Eu sou o criador desta biblioteca).
  • SyntaxKit : Uma solução nativa de Sam Soffes , mas nos estágios iniciais de desenvolvimento. Deve suportar qualquer syntax TextMate no futuro. Este deve ser o caminho a percorrer quando a biblioteca estiver madura o suficiente.