web-dev-qa-db-fra.com

UILabel erroné Word Wrap dans iOS 11

J'ai un problème avec une application utilisant des XIB sans mise en page automatique. Je ne sais pas s'il s'agit d'informations importantes.

J'ai UILabel avec 2 lignes en utilisant Word Wrap. Dans iOS 10, le retour à la ligne fonctionnait correctement et la première ligne contenait un mot + caractère spécial, par exemple l'esperluette. Exemple:

UiLabel on ios 10

Ensuite, sur iOS 11, le retour à la ligne fonctionne mal et met l'ampresand à la deuxième ligne:

UiLabel on ios 11

Cela est problématique car les mots plus longs, qui sont normalement installés sur la deuxième ligne, ne sont pas affichés correctement. Une idée de ce qui a changé? Je connais safeArea mais cela ne ressemble pas à la raison. Des idées sur la façon de déplacer cette esperluette vers le haut, où y a-t-il beaucoup d'espace pour cela?

Reste des paramètres: size inspector

36
studentbi

Cela pourrait très probablement être un changement intentionnel de Apple pour éviter les lignes veuves. Du point de vue de la conception, il est préférable d'éviter d'avoir un seul mot sur une ligne de texte. Il semble donc qu'UILabel maintenant rompt la ligne de manière à ce que la deuxième ligne de texte contienne toujours au moins 2 mots.

Il est surprenant qu'il n'y ait cependant aucune documentation ou moyen de désactiver ce comportement.

enter image description here

Voici également n bon article sur le texte "veuf" et "orphelin".

48
brynbodayle

Lancement de l'application avec les arguments -NSAllowsDefaultLineBreakStrategy NO (un paramètre par défaut non documenté) semble revenir à l'ancien comportement. Vous pouvez également définir NSAllowsDefaultLineBreakStrategy sur NO dans NSUserDefaults au démarrage (Apple enregistre une valeur par défaut de YES pour cette valeur lorsque UILabel ou le code de dessin de chaîne est initialisé, il apparaît, vous devrez donc enregistrer une valeur de remplacement après cela, ou l'insérer dans le NSArgumentDomain, ou simplement définir la valeur par défaut de manière persistante).

Apple peut considérer cette API privée et rejeter les applications qui l'utilisent; Je ne suis pas sûr. Je n'ai pas essayé cela dans une application d'expédition. Cependant, cela fonctionne dans les tests rapides - vu le paramètre dans NSUserDefaults et trouvé le changer a modifié le comportement.

18
Carl Lindberg

Ce n'est pas vraiment une réponse, mais je veux ajouter une illustration de la façon dont c'est un problème général, pas du tout lié aux esperluettes.

two UILabels

Ces deux UILabels ont des contraintes de largeur identiques et le texte est presque identique. Mais le second a le retour à la ligne que j'attendrais. Le premier est incorrect, le "à propos" peut clairement rester sur la première ligne.

10
David Dunham

Une option peut être d'utiliser un UITextView à la place - qui ne semble pas avoir ce comportement. Si vous définissez NSTextContainer.lineFragmentPadding sur 0, textContainerInset sur UIEdgeInsetsZero et désactivez tout défilement (scrollEnabled, rebonds, indicateurs de défilement, etc.), il s'affichera de manière similaire à un UILabel, mais pas avec autant de flexibilité de contrainte. Ce n'est pas un remplacement sans rendez-vous, mais dans certaines situations, il est acceptable.

1
Carl Lindberg

Il semble que le remplacement de l'espace avant l'esperluette par un espace insécable (U + 00A0) maintient l'esperluette sur la même ligne. Selon la façon dont vous générez le texte pour l'étiquette, cela peut ne pas être facile à automatiser (peut-être avez-vous vraiment besoin que l'esperluette soit sur la deuxième ligne dans certains cas).

1
Geoff Hackworth