19 votes

Afficher beaucoup de texte riche : choisir la meilleure option

Quelle est la meilleure façon d'afficher lots de RichText (formaté en HTML)

En ce moment, je travaille sur une application pour un forum. Comme vous pouvez vous y attendre, les messages sur le site comportent beaucoup de formatage HTML, de listes, d'images, etc. texte en gras , texte en couleur, etc...

Il y a maintenant plusieurs options auxquelles je pense (aucune d'entre elles n'est idéale, s'il vous plaît, si vous pensez à d'autres options, postez-les dans les commentaires) :

  • Cellules personnalisées utilisant NSAttributedString+HTML + DTAttributedTextView pour chaque poste ?

    Des problèmes : J'ai utilisé ailleurs les catégories NSAttributedString+HTML dans l'application et ce n'était pas idéal, la création d'une NSAttributedString semble être assez coûteuse (lente) même en petites quantités. Pour 10+ messages dont chacun peut être la longueur d'un article entier serait terrible. + Bien que DTAttributedTextView prenne en charge la balise html IMG (et la plupart des balises), il ne prend pas en charge le chargement à distance des images, sauf si vous spécifiez leur largeur et leur hauteur dans la balise img. Et pour un forum où une balise IMG peut être un smiley (10*10) ou une capture d'écran (640*960), il n'y a aucun moyen de le prévoir. (Depuis la rédaction de cette NSAttributedString+HTML, qui est maintenant renommée DTCoreText a ajouté un support complet pour <img> et grandement améliorée)

  • Cellules personnalisées avec un UIWebView dedans pour chaque article ?

    J'ai réfléchi à cette question pendant un certain temps, mais en lisant cet article de blog Je me suis rendu compte du problème que cela poserait, Défilement fluide . L'idée d'avoir une application native pour un site est qu'il est meilleur puis en utilisant un simple UIWebView pour afficher le thème mobile du site. Si l'application est lente et saccadée lors du défilement, c'est que l'application ne fonctionne pas. pire pas mieux (de plus, comme j'ai besoin d'afficher des images, cacher les webviews comme il le suggère ne fonctionnerait pas). De plus, les UIWebViews doivent être créées sur le thread principal, sinon elles se cassent.

  • Retour à l'UIWebView ? En plus de faire une tricherie pitoyable, (comme dans le cas de la Application iFans ) où vous n'affichez que du texte et où, s'ils cliquent dessus, une UIWebView se charge avec toutes les belles images, etc..., la seule option qui reste semble être de faire ce que je pense que l'application TapaTalk fait et d'avoir la vue entière du fil de discussion comme une UIWebView. Ce n'est pas trop mais je trouve l'idée d'utiliser un UIWebView dans un site web très intéressante, car il aura probablement de bonnes performances et me permettra d'ajouter des thèmes contrôlés par l'utilisateur, etc. indigène répugnant.

Est-ce que quelqu'un a de l'expérience dans la création d'une application alimentée par le web, par exemple peut-être un client facebook, une application de forum ou une application de nouveau site qui devait afficher le contenu du site (je ne compte pas vraiment le client twitter car il ne doit gérer que du texte et des liens en petites quantités par message). Avez-vous des idées sur la meilleure façon d'afficher du contenu RichText dans une application iOS ?

Toute idée doit tenir compte du terrain :

  • Texte multicolore.
  • Texte aligné à droite, à gauche et au centre.
  • Images (de taille variable).
  • Texte en gras.
  • Texte de différentes tailles et polices.
  • Souligne le texte.
  • Vidéos sur YouTube.
  • Tableaux HTML.

Au cas où la question ne serait pas très claire, je vais la résumer :

" Quelle est la meilleure façon d'afficher beaucoup de contenu RichText (formaté en HTML) pour une application client de forum ? "

3voto

Keller Points 6797

Donc, si je lis bien, vous voulez que les messages du forum d'un sujet donné soient des cellules d'un UITableView et que les cellules aient besoin d'un formatage riche ?

En supposant que cela soit correct, j'imagine que chaque message occupera une grande partie de l'écran (grande hauteur de cellule). Dans ce cas, avoir une UIWebView en tant que sous-vue pourrait ne pas être aussi mauvais en termes de performances que vous pourriez le penser. UITableView réutilise les cellules, de sorte que seules les cellules visibles doivent être chargées en mémoire.

Je suppose également que vous êtes en mesure d'accéder au forum via une API, n'est-ce pas ? Dans ce cas, vous devriez être en mesure de précharger les données immédiatement avant de charger la vue et les UIWebViews ne seront utilisées que pour le formatage. Vous pouvez même charger un fichier CSS à partir de votre bundle d'application lorsque vous chargezHTMLString dans votre UIWebView afin de ne pas le charger depuis un serveur à chaque fois.

Tout ceci étant dit, si vous aviez beaucoup de cellules visibles simultanément, ce serait une autre histoire et j'envisagerais peut-être de n'afficher que du texte brut dans l'index UITableView et de n'afficher le formatage riche que lorsque l'utilisateur touche la cellule pour afficher le message unique. Cela pourrait également être mieux du point de vue de la conception, car avoir une tonne de cellules formatées différemment à l'écran pourrait potentiellement donner un aspect un peu négligé.

De plus, cela peut sembler évident (surtout que vous semblez être à la fois conscient des performances et de la conception), mais n'utilisez pas UIWebView pour les contrôles de l'interface utilisateur. Chaque fois que je vois une barre d'onglets UIWebView ou une fausse barre de navigation, je grimace (ack, Netflix). Pour le formatage cependant, c'est souvent la seule façon de voler si vous chargez beaucoup de contenu dynamique depuis un serveur.

2voto

Cocoanetics Points 5729

NSAttributedString+HTML prend déjà en charge le chargement paresseux des images. Voir la démo qui montre comment faire. C'est raisonnablement rapide, mais il faut éviter d'analyser le HTML pour le contenu qui n'est pas à l'écran.

Cela dépend surtout de l'interface utilisateur que vous souhaitez obtenir. NSAS+HTML est destiné aux situations où vous contrôlez la qualité du HTML (c'est-à-dire parce que vous le générez vous-même). Il vous offre un niveau de contrôle sans précédent sur la hiérarchie des vues, car vous pouvez intégrer vos propres vues personnalisées pour afficher les images.

Dans d'autres cas où vous ne pouvez pas être sûr de la qualité du HTML, vous devez utiliser UIWebView et contourner toutes ses limitations, l'une d'entre elles étant qu'il prend d'énormes quantités de RAM et qu'il est lent à afficher le contenu. De plus, UIWebView n'est pas thread-safe (parce que WebKit ne l'est pas).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X