mots clefs : développement iPhone/iPad, insertion indice, insertion exposant, interface builder, fonts, attributes.

Le point de départ de la recherche publiée dans cet article est le suivant :

Comment afficher des lettres en indices et exposants pour des formules mathématiques dans un UILabel tout en utilisant pour y arriver Interface Builder ?

Par exemple comment afficher : Vn sur un écran conçu dans Interface Builder ?

La réponse courte est la suivante : Il n’y a pas de manière parfaite pour le faire.

Les deux manières simples pour obtenir le résultat escompté visuellement tout en définissant les écrans dans interface builder sont :

Créer deux Labels un pour “F” et l’autre pour “x” et les positionner, grâce à la souris, de manière à obtenir l’effet souhaité.

Créer une image (par exemple en capturant l’écran autour de “Fx “ tapé dans un éditeur de texte et ensuite l’insérer dans interface builder grâce à des UIImageView.

Voici une autre piste intéressante que nous avons tenté néanmoins de suivre.

Dans interface Builder, il est possible d’insérer dans les UILabel des caractères spéciaux. Qu’est-ce qu’un caractère spécial ? c’est un caractère se trouvant dans la définition UNICode (qui compte 109 000 caractères, y compris les caractères chinois, arabes, etc ..) mais qui ne se trouve pas dans les caractères usuels courants (essentiellement définis dans l’ASCII).

Pour les exposants (superscript en anglais) nous avons trouvé notre bonheur. En effet, dans UNICode le caractère n est prévu : son numéro est le 0x207F. Quand on insère un caractère spécial dans interface builder, on peut choisir le caractère en question en précisant son chiffre UniCode “0x207F” et là on est ravi de constater la présence du caractère n porté en indice. Et on se croit sorti d’affaire, mais, …

… quand on essaie de renouveler l’opération pour l’indice (subscript en anglais), qu’on insère un caractère spécial, qu’on cherche le caractère UniCode “0x2099” qui est supposé correspondre à n on constate, à regret, que le caractère n’est défini pour aucune des polices (FONT en anglais) listées dans Interface Builder.

Rajouter un fichier de FONT dans l’application

Nous avons donc naturellement décidé de trouver une manière pour rajouter un fichier de police (add a custom font en anglais 🙂 )dans notre projet.

Nous avons, en effet, réussi à le faire. (pour le détail de cette recherche voir ici).
Malheureusement, si le fichier de font sur mesure rajouté dans le projet est utilisable programmatiquement (en l’appelant dans le code), il n’est pas accessible à partir d’interface Builder.

Il semblerait donc qu’interface Builder propose un choix de Fonts prédéfinis et qu’on ne peut pas l’étendre en incorporant les FONT dans l’application.
Une recherche sur le net, laisse à croire que cette carence dans interface Builder est tout simplement un Bug ; apparemment reporté à Apple dès juillet 2010 ! Il sera peut-être corrigé un jour …

Ce qu’il est possible de faire afin de contourner le problème, c’est :
– D’installer un fichier de FONT supportant les indices et les exposants dans l’application.
– De créer une sous-classe de UILabel qui s’auto-affecte (dans viewdidload par exemple) le FONT souhaité dans sa propriété “.font”.
– De rentrer les caractères spéciaux dans Interface Builder par leur numéro ; En acceptant que les caractères en question ne s’affichent pas de manière lisible dans Interface Builder
(ils sont remplacés par un carré blanc à bord noir).

Quand l’exécution est lancée, le UILabel au moment d’être loadé, change son propre font (vers le font supportant exposants et indices) et affiche donc correctement le caractère spécial (0x2099 par exemple correspondant à n en indice).

Des fichiers de FONT supportant indices et exposants durs à trouver.

La dernière difficulté que nous rencontrons est d’ordre plus général : nous n’avons pas encore trouvé de fichier de font supportant toutes les lettres de l’alphabet en indice et en exposant.

Pourquoi est ce que les fichiers de FONT supportant les lettres en indices et en exposant sont difficiles à trouver ?

La majorité des éditeurs de textes n’ont pas besoin des caractères Unicode correspondant aux lettres latines en indice et en exposant. En effet, il suffit que ces éditeurs de texte réduisent la taille normale de la lettre “n” par exemple, et la surélèvent par rapport à la ligne d’écriture pour “fabriquer” un exposant à partir d’une lettre courante. La même chose vaut pour l’indice.

La SDK de l’iOS permet-elle de fabriuer des indices à partir des lettres courantes ?

La SDK, par le biais du framework CORE TEXT, offre au développeur un objet nommé NSAttributeString. Cet objet – qui ne dérive pas de NSString mais de NSObject directement – permet d’affecter à tous les caractères ou bien à une sous-partie des caractères qu’il contient des attributs. Ces attributs portent sur la couleur, la position relativement à la ligne d’écriture, la taille de la police, le sous-lignage, le sur-lignage, etc…

La manière d’utiliser cette notion est décrite ici.

Par contre, cette notion, n’est pas supportée par UILabel, qui n’accepte que le NSString dans sa propriété “.text”. Afin de pouvoir afficher le NSAttributedString, il faut utiliser CALayer.
Il existe sur le net des classes dérivées de UILabel capables de recevoir un NSAttributedString dans leur “.text” et de l’afficher correctement.

Il est donc complètement hors de question de pouvoir utiliser la notion des attributs dans Interface Builder à l’heure actuelle. Toutefois, quand on lance la fenêtre de choix de police dans interface builder, on constate la présence d’outils prévus pour la sélection du surlignage et du soulignage. Sans doute, les concepteurs d’Interface Builder, avaient-ils dans l’esprit d’implémenter le support des attributes quand ils ont placé ces outils dans la fenêtre de sélection des polices. Pour le moment, ces outils sont inopérants. Ils sont, à mon avis, restés là pour préparer les évolutions qui les rendraient un jour opérants.

Dernier acte de la pièce … créer un font !

Comme les fonts qui supportent les indices et les exposants sont presque introuvables, il ne nous reste qu’une chose à faire, modifier un des fonts classiques (par exemple Arial) pour qu’il puisse supporter les indices de toutes les lettres de l’alphabet.
Voilà, comment modifier un fichier de FONT. (Comment créer un fichier de font ou modifier un fichier de font existant).

liens : developpement iphone, developpement ipad