48 votes

UITextView ne rend pas correctement la police personnalisée dans iOS 7

Mon application utilise un UITextView pour saisir du texte syriaque (police Estrangelo), mais l'UITextView rend certaines lettres de manière incorrecte comme ceci :

enter image description here

Je l'ai testé avec un UILabel et un UITextView. UILabel l'affiche correctement, mais UITextView affiche incorrectement les points du haut et les déplace vers le bas (voir le résultat ci-dessus).

Ce problème ne se produit que dans iOS 7 et ne se produit pas dans iOS 6. Veuillez me dire s'il y a un moyen de résoudre ce problème.

C'est mon code de test

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 40)];
label.center = CGPointMake(self.view.center.x, self.view.center.y-40);
label.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24];
label.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃";
[self.view addSubview:label];

UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 100, 40)];
textView.center = CGPointMake(self.view.center.x, self.view.center.y+40);
textView.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24];
textView.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃";
[self.view addSubview:textView];

6voto

Leo Natan Points 25262

J'ai débogué un peu ce problème, et il semble qu'il s'agisse d'un bug dans la façon dont NSLayoutManager met en page le texte. Comme l'ont souligné d'autres réponses, UITextView est construit autour de TextKit depuis iOS7, et utilise donc NSLayoutManager en interne pour mettre en page le texte. UILabel utilise Core Text pour mettre le texte en page directement. Les deux utilisent finalement Core Text pour rendre les glyphes.

Vous devriez ouvrir un rapport de bogue avec Apple et poster le numéro pour que les gens puissent le reproduire. Le problème n'a pas été corrigé jusqu'à présent dans les versions bêta d'iOS7.1.

Comme solution de rechange, vous pouvez remplacer UITextView avec d'autres éditeurs alternatifs de Core Text, qui mettent en page et effectuent le rendu directement avec Core Text, où le problème n'existe pas.

J'ai testé SECoreTextView et le texte s'affiche correctement. Il implémente une API similaire à UITextView mais utilise en interne le texte de base.

Voici à quoi il ressemble après l'échange UITextView con SECoreTextView :

SETextView *textView = [[SETextView alloc] initWithFrame:CGRectMake(0, 0, 100, 40)];
textView.center = CGPointMake(self.view.center.x, self.view.center.y+40);
textView.font = [UIFont fontWithDescriptor:desc size:24];
textView.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃";
textView.textColor = [UIColor blackColor];
textView.backgroundColor = [UIColor whiteColor];
textView.editable = YES;

[self.view addSubview:textView];

Using Core Text, the layout issue does not exist.

2voto

iPatel Points 15121

Il y a quelques jours, j'ai eu le même problème que le vôtre en iOS 7 (mais la police était différente) . J'ai réglé le FONT après avoir réglé le TEXTE et ça a marché pour moi. Donc pour votre cas :

textView.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃"; // Setting the text.
textView.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24]; // Setting the font and it's size.

Ça peut paraître idiot, mais ça a marché pour moi.

Voir également ceci question/réponse . Il existe de nombreux conseils pour utiliser les polices personnalisées avec les éléments suivants UITextView qui pourrait vous être utile.

EDIT :

iOS 7 a également introduit une nouvelle selectable sur la propriété UITextView pour activer la sélection de texte. Assurez-vous donc que vous avez effectué les opérations suivantes :

self.textField.editable = YES;
self.textField.selectable = ON;

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