web-dev-qa-db-fra.com

UITextView avec mise en évidence de la syntaxe

Comment faire la coloration syntaxique dans un UITextView, en particulier coloration syntaxique (et détection) pour Objective-C sur le iPhone?

Certaines de mes idées sur la façon de procéder:

  • NSAttributedString. Maintenant disponible dans iOS 3.2 et supérieur. Mais comment pourrais-je mettre un NSAttributedString dans un UITextView?
  • UIWebView. Superposez-le lorsque l'utilisateur a terminé la modification et coloriez le texte avec des feuilles de style CSS. Mais comment pourrais-je faire cela dans un UIWebView, en lui donnant le texte puis en le coloriant?
39
Joshua

MISE À JOUR: Depuis iOS 7 et TextKit, la coloration syntaxique est devenue facile comme bonjour. Ne cherchez pas plus loin qu'ici pour une introduction (par moi).


En supposant que vous vouliez un composant modifiable, il n'y a pas trop d'espoir. Donner un aperçu rapide, juste pour m'assurer que je couvre tout:

  • UITextView: texte brut uniquement, pas de contournement (public). Mais modifiable. Aucune chance de modifier quoi que ce soit, aucune chance d'obtenir la géométrie, etc. Utilise une vue Web en interne. Chaque paragraphe est un <div>, qui est modifié par le moteur d'édition. Vous pouvez modifier le DOm là-dedans, mais c'est une API privée. Tout privé, donc pas d'option.
  • UIWebView: html, donc il peut être stylisé, avoir des images incorporées, etc. Je suppose (sans y regarder) que c'est ce que le Three 20 UI utilise précédemment. Le problème: ne peut pas être modifié. Il n'y a aucun moyen (public) de contourner cela. Vous ne pouvez pas obtenir de sélections, accéder au DOM, etc. sans API privée et beaucoup de maux de tête. L'édition fonctionnerait comme dans UITextView mais nécessiterait un tout nouveau niveau de maux de tête. Toujours: privé.
  • CoreText Framework: Depuis iOS 3.2 un très très bon moteur rendu. Mais c'est tout. Peut directement mettre en page et rendre NSAttributesStrings. Cependant, il n'y a aucune interaction avec l'utilisateur. Pas de sélection de texte, pas de saisie de texte, pas de vérification orthographique, pas de remplacement, pas de surbrillance, non non non non non. Juste rendu. Et pas mal de travail pour le rendre rapide sur les anciens appareils avec de longs textes.
  • UITextInput Protocole: permet d'interagir avec le clavier et de saisir saisie de texte. Comprend également des remplacements de texte de base. Problème: saisie de texte uniquement, mal documentée. Pas de sélection de texte, etc. (voir ci-dessus).

Donc nous en sommes là. Deux composants entièrement fonctionnels sans fonction centrale et deux solutions partielles sans chaînon manquant. Voici toutes les approches viables que je peux trouver:

  • Demandez à l'utilisateur de modifier un UITextView sans style et d'afficher le contenu stylisé dans un UIWebView. Pour ce dernier, vous pouvez utiliser la chose Three20.
  • Créez le lien manquant entre CoreText et UITextInput. Cela inclut, mais sans s'y limiter, la sélection de texte, la surbrillance, les couleurs d'arrière-plan, le stockage et la gestion du texte, l'efficacité, la vérification orthographique, etc. Certains d'entre eux sont fournis par les cadres du système mais nécessitent encore beaucoup d'intégration.
  • Déposez un bug et attendez l'arrivée d'une belle API publique (mon approche personnelle).
  • Convaincre Apple pour autoriser à nouveau l'API privée et jouer avec UItextViews DOM.

Le groupe Omni a adopté la deuxième approche et a créé une vue texte modifiable. Vous pouvez le trouver dans le framework OmniUI . Cependant, cette implémentation est loin d'être parfaite. (au moins c'était lors de ma dernière vérification il y a quelques mois). Ils ont essayé dur mais n'ont toujours pas réussi à atteindre la perfection d'Apple dans l'interaction avec l'utilisateur. Apple doit avoir investi au moins quelques années-homme pour ne faire que l'interaction UI avec la sélection et l'édition de texte. Rien à faire à la maison, et comme il semble même pour les entreprises comme l'omni groupe.

Il y a un aspect intéressant à tout cela: iWork. Apple prétend ne pas utiliser d'API privée. Mais la sélection de texte est la même que dans le système d'exploitation. Ils doivent donc avoir copié la source du framework dans les applications. Approche très honnête;)

75
Max Seelemann

Depuis iOS 5, vous pouvez utiliser un UIWebView et définir contenteditable="true" sur un div en elle. Cela fait que l'UIWebView ouvre un clavier et permet à l'utilisateur de saisir directement du texte dans le DOM. Vous pouvez ensuite écrire une webapp qui met en évidence la syntaxe. Vous pouvez communiquer avec l'application cacao avec des URL personnalisées.

Le seul problème que j'ai, c'est que vous ne semblez pas faire de vérification orthographique.

12
mxcl

JTextView est un remplacement de UITextView qui prend en charge un magasin de texte NSAttributedString. Il permet l'affichage de texte riche mais est incomplet.

2
ma11hew28

Si quelqu'un cherche toujours une solution complète pour cela, je connais deux bibliothèques qui fournissent ceci:

  • Highlightr : A Swift pour la coloration syntaxique, prend en charge des centaines de langues mais utilise JS comme backend. Elle est cependant assez rapide pour une édition en direct. ( Avertissement : Je suis le créateur de cette bibliothèque).
  • SyntaxKit : Une solution native par Sam Soffes , mais aux premiers stades de développement. Devrait prendre en charge toute syntaxe TextMate à l'avenir. Cela devrait être la voie à suivre lorsque la bibliothèque est suffisamment mature.
1
JP Illanes

Je ne sais pas grand chose sur la détection de syntaxe, mais si vous voulez avoir plusieurs styles dans la même UITextView, alors Three 20 UI est une chose que vous devriez regarder

Voici une autre question qui peut vous concerner: Quelle est la meilleure façon d'implémenter la coloration syntaxique du code source dans Cocoa . Je ne sais pas s'il s'agit d'un Mac ou d'un iPhone, mais je pense que si vous combinez cela et Three20, vous pouvez avoir le vôtre dans l'iPhone. Bonne chance

0
vodkhang