69 votes

UILabel mauvais mot wrap dans iOS 11

J'ai un problème avec l'application à l'aide de XIBs sans mise en page automatique. Je ne sais pas si c'est une information importante.

J'ai UILabel avec 2 lignes à l'aide de word wrap. Dans iOS 10 word wrap a été fonctionne correctement, et la première ligne contient un mot + un caractère spécial, par exemple esperluette. Exemple:

UiLabel on ios 10

Puis sur iOS 11 retour automatique à la ligne de travail est quelque chose de mauvais et met ampresand à la deuxième ligne:

UiLabel on ios 11

Ceci est problématique car les mots plus longs, qui normalement monté sur la deuxième ligne de maintenant ne sont pas affichées correctement. Aucune idée de ce qui a changé? Je sais que sur safeArea mais il ne ressemble pas à la raison. Toutes les idées sur la façon de se déplacer que esperluette vers le haut, où est l'abondance de l'espace pour cela?

Autres paramètres: size inspector

90voto

brynbodayle Points 4120

Cela pourrait très probablement une modification intentionnelle par Apple pour éviter veuves lignes. À partir d'une conception de point de vue, il est préférable d'éviter d'avoir un seul mot sur une ligne de texte. Il semble donc que UILabel maintenant les sauts à la ligne dans une manière que la deuxième ligne de texte a toujours au moins 2 mots sur elle.

Il est surprenant qu'il n'y a pas de documentation ou de désactiver ce comportement si.

enter image description here

Aussi voici un bon article à propos de "veuf" et "orphelins" du texte.

24voto

Carl Lindberg Points 976

Le lancement de l'app avec les arguments -NSAllowsDefaultLineBreakStrategy NO (un sans-papiers réglage par défaut) semble revenir à l'ancien comportement. Alternativement, vous pouvez configurer NSAllowsDefaultLineBreakStrategy de NO en NSUserDefaults au démarrage (Apple enregistre un défaut d' YES de cette valeur lors de l' UILabel ou la chaîne de caractères code de dessin est initialisé, il apparaît, donc, vous devez enregistrer une valeur de remplacement après, ou l'insérer dans l' NSArgumentDomain, ou tout simplement de définir la valeur par défaut de façon persistante).

Apple peut considérer qu'une API privée et de rejeter les applications qui l'utilisent; je ne suis pas sûr. Je n'ai pas essayé cette expédition app. Cependant, c'est dans le test rapide -- a vu la mise en NSUserDefaults et trouvé le changer modifié le comportement.

14voto

David Dunham Points 4620

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.

deux étiquettes UIL

Ces deux étiquettes UIL ont des contraintes de largeur identiques et le texte est presque identique. Mais le second a le mot wrap je m'attendrais. Le premier est incorrect, le "à propos" peut clairement rester sur la première ligne.

1voto

Geoff Hackworth Points 423

Il semble que le remplacement de l'espace avant l'esperluette par un espace insécable (U + 00A0) maintienne l'esperluette sur la même ligne. Selon la manière 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).

1voto

Carl Lindberg Points 976

Une option peut être d'utiliser une UITextView à la place - cela 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 la même manière qu'un UILabel, mais avec une flexibilité trop importante. Ce n'est pas un remplacement immédiat, mais dans certaines situations, c'est acceptable.

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