UITextView con evidenziazione della syntax

Come fare Sintassi Evidenziare in un UITextView , in particolare l’ evidenziazione della syntax (e il rilevamento ) per Objective-C su iPhone ?

Alcune delle mie idee su come fare questo:

  • NSAttributedString . Ora disponibile su iOS 3.2 e versioni successive. Ma come potrei inserire un NSAttributedString in una UITextView?
  • UIWebView . Sovrapponetelo quando l’utente ha finito di modificare e colorare il testo con i fogli di stile CSS. Ma come lo farei in un UIWebView , dandogli il testo e poi colorandolo?

AGGIORNAMENTO: Dal momento che iOS 7 e TextKit , l’evidenziazione della syntax è diventato facile come torta. Non guardare oltre per un’introduzione (da parte mia).


Supponendo che tu voglia un componente modificabile, non c’è troppa speranza. Dare una rapida panoramica, solo per assicurarmi di coprire tutto:

  • UITextView : solo testo normale , no (pubblico). Ma modificabile . Nessuna possibilità di modificare nulla, nessuna possibilità di ottenere la geometria, ecc. Utilizza internamente una vista web. Ogni paragrafo è un

    , che viene modificato dal motore di modifica. È ansible modificare il DOm in là ma questa è tutta API privata. Tutto privato, quindi nessuna opzione.

  • UIWebView : html , quindi può essere stilizzato, avere immagini incorporate, ecc. Immagino (senza esaminarlo) che questo è ciò che usa l’interfaccia utente Three 20 precedentemente menzionata. Il problema: non può essere modificato . Non c’è un modo (pubblico) intorno a questo. Non puoi ottenere selezioni, accedere al DOM, ecc. Senza API private e un sacco di mal di testa. La modifica funzionerebbe come in UITextView ma richiede un nuovo livello di mal di testa. Ancora: privato.
  • CoreText Framework: Dal momento che iOS 3.2 è un motore di rendering molto molto buono. Ma è così. Può direttamente il layout e il rendering di NSAttributesString s. Tuttavia, non c’è interazione dell’utente. Nessuna selezione di testo, nessun inserimento di testo, nessun controllo ortografico, nessuna sostituzione, nessuna evidenziazione, no no no no no. Solo rendering E un bel po ‘di lavoro per renderlo veloce su vecchi dispositivi con lunghi testi.
  • Protocollo UITextInput : consente l’interazione con la tastiera e l’ inserimento del testo . Include anche sostituzioni di testo di base. Problema: solo input di testo, mal documentato. Nessuna selezione di testo ecc. (Vedi sopra).

Allora eccoci qua. Due componenti completamente funzionali privi di una funzione centrale e due soluzioni parziali prive del collegamento mancante. Qui ci sono tutti gli approcci possibili che posso proporre:

  • Chiedere all’utente di modificare UITextView disegni e visualizzare il contenuto in stile in un UIWebView . Per quest’ultimo è ansible utilizzare la cosa Three20.
  • Crea il collegamento mancante tra CoreText e UITextInput . Ciò include, ma non è limitato a, selezione del testo, evidenziazione, colors di sfondo, memorizzazione e gestione del testo, efficienza, controllo ortografico ecc. Alcuni di questi sono forniti da framework di sistema ma necessitano ancora di molta integrazione.
  • Presenta un bug e attendi una buona API pubblica (il mio approccio personale).
  • Convinci Apple a consentire nuovamente l’API privata e UItextView il UItextView con il DOM di UItextView .

Omni Group ha adottato il secondo approccio e creato una visualizzazione di testo modificabile. Puoi trovarlo nel framework OmniUI . Tuttavia, questa implementazione è tutt’altro che perfetta. (almeno lo era quando l’ho controllato l’ultima volta qualche mese fa). Ci hanno provato molto ma ancora non sono riusciti a raggiungere la perfezione di Apple nell’interazione con l’utente. Apple deve aver investito almeno un paio d’anni nel fare solo l’interazione dell’interfaccia utente con la selezione e la modifica del testo. Nulla da fare a casa, e come sembra anche per le aziende come il gruppo omni.

C’è un aspetto interessante di tutto questo: iWork. Apple afferma di non utilizzare alcuna API privata al loro interno. Ma la selezione del testo è la stessa del sistema operativo. Quindi devono aver copiato la sorgente framework nelle app. Approccio molto onesto;)

Da iOS 5 puoi utilizzare UIWebView e impostare contenteditable="true" su un div in esso. Ciò rende UIWebView una tastiera aperta e consente all’utente di inserire direttamente il testo nel DOM. Puoi quindi scrivere una webapp che evidenzi l’evidenziazione della syntax. Puoi comunicare con l’app cocoa con URL personalizzati.

L’unico problema che ho è che non sembri avere il controllo ortografico.

JTextView è una sostituzione di UITextView che supporta un NSAttributedString testo NSAttributedString . Permette la visualizzazione di rich text ma è incompleto.

Non so molto sul rilevamento della syntax, ma se vuoi avere più stili nello stesso UITextView, allora l’ interfaccia utente Three 20 è una cosa che dovresti guardare

Ecco un’altra domanda che potrebbe riguardarti: qual è il modo migliore per implementare l’evidenziazione della syntax del codice sorgente in Cocoa . Non sono sicuro che si tratti di Mac o iPhone, ma penso che se combini questo e il Three20, puoi averne uno in iPhone. In bocca al lupo

Se qualcuno ancora sta cercando una soluzione completa per questo, conosco due librerie che forniscono questo:

  • Highlightr : una libreria Swift per l’evidenziazione della syntax, supporta centinaia di lingue ma usa JS come backend. È abbastanza veloce per l’editing dal vivo, però. ( Disclaimer : io sono il creatore di questa libreria).
  • SyntaxKit : una soluzione nativa di Sam Soffes , ma nelle prime fasi di sviluppo. Dovrebbe supportare qualsiasi syntax di TextMate in futuro. Questa dovrebbe essere la strada da percorrere quando la biblioteca è abbastanza matura.