ti-enxame.com

UITextView com destaque de sintaxe

Como fazer o destaque da sintaxe em um UITextView, especificamente destaque da sintaxe (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-o quando o usuário terminar de editar e colorir o texto com folhas de estilo CSS. Mas como eu faria isso em um UIWebView, fornecendo o texto e colorindo-o?
39
Joshua

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


Supondo que você deseja um componente editável, não há muita esperança. Fornecendo uma visão geral rápida, apenas para garantir que eu cubra tudo:

  • UITextView: texto sem formatação somente, não existe (público) o caminho. Mas editável. Sem chance de alterar nada, sem chance de obter geometria etc. Usa uma visualização da Web internamente. Cada parágrafo é um <div>, que é alterado pelo mecanismo de edição. Você pode alterar o DOm, mas isso é tudo API privada. Tudo privado, portanto, não há opção.
  • UIWebView: html, para que possa ser estilizado, ter imagens incorporadas etc. Eu acho (sem investigar) que é isso que a interface do Three 20 UI mencionada anteriormente usa. O problema: não pode ser editado. Não existe uma maneira (pública) de contornar isso. 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 requer um novo nível de dor de cabeça. Ainda: particular.
  • CoreText Framework: Desde o iOS 3.2, um mecanismo muito bom rendering. Mas é isso. Pode fazer o layout e renderizar diretamente NSAttributesString s. No entanto, não há interação do usuário. Sem seleção de texto, sem entrada de texto, sem verificação ortográfica, sem substituições, sem destaques, não, não, não, não. Apenas renderizando. E bastante trabalho para torná-lo mais rápido em dispositivos antigos com textos longos.
  • UITextInput Protocolo: Permite interação com o teclado e captura entrada de texto. Também possui substituições básicas de texto. Problema: somente entrada de texto, 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 função central e duas soluções parciais que não possuem o link ausente. Aqui estão todas as abordagens viáveis ​​que posso apresentar:

  • Peça ao usuário que edite um UITextView sem estilo e exiba o conteúdo com estilo em um UIWebView. Para o último, você pode usar a coisa Three20.
  • Crie o link ausente entre CoreText e UITextInput. Isso inclui, entre outros, seleção de texto, destaque, cores de plano de fundo, armazenamento e gerenciamento de texto, eficiência, verificação ortográfica etc. Alguns deles são fornecidos pelas estruturas do sistema, mas ainda precisam de muita integração.
  • Arquive um bug e aguarde a chegada de uma API pública de Nice (minha abordagem pessoal).
  • Convença Apple para permitir API privada novamente e mexa com o DOM de UItextView).

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

Há um aspecto interessante em tudo isso: iWork. Apple afirma não usar nenhuma API privada neles. Mas a seleção de texto é a mesma que no sistema operacional. Portanto, eles devem ter copiado a fonte da estrutura nos aplicativos. Abordagem muito honesta;)

75
Max Seelemann

Desde o iOS 5, você pode usar um UIWebView e definir contenteditable="true" em uma div nele. Isso faz com que o UIWebView abra um teclado e permita que o usuário insira texto diretamente no DOM. Você pode escrever um aplicativo da web que realce a sintaxe. Você pode se comunicar com o aplicativo cacau com URLs personalizados.

O único problema que tenho é que você não parece ter verificado a ortografia.

12
mxcl

JTextView é uma substituição de UITextView que suporta um armazenamento de texto NSAttributedString. Permite a exibição de rich text, mas está incompleto.

2
ma11hew28

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

  • Highlightr : Uma Swift biblioteca para realce de sintaxe, suporta centenas de idiomas, mas usa JS como back-end. É rápido o suficiente para edição ao vivo. ( Isenção de responsabilidade : eu sou o criador desta biblioteca).
  • SyntaxKit : Uma solução nativa por Sam Soffes , mas nos estágios iniciais de desenvolvimento. Deverá suportar qualquer sintaxe do TextMate no futuro. Esse deve ser o caminho a seguir quando a biblioteca estiver madura o suficiente.
1
JP Illanes

Eu não sei muito sobre detecção de sintaxe, mas se você quiser ter vários estilos no mesmo UITextView, então Three 20 UI é algo que você deve observar

Aqui está outra questão que pode estar relacionada a você: Qual é a melhor maneira de implementar o realce da sintaxe do código fonte no caca . Não tenho certeza se é Mac ou iPhone, mas acho que se você combinar isso e o Three20, poderá ter o seu no iPhone. Boa sorte

0
vodkhang