UILabel mauvais mot, enveloppez-la dans iOS 11

j'ai des problèmes avec l'application en utilisant des fichiers XIBs sans autolayout. Je ne sais pas si c'est une information importante.

J'ai UILabel avec 2 lignes en utilisant le mot wrap. Dans iOS 10 enveloppement de mot fonctionnait correctement, et la première ligne contenait un mot + caractère spécial, par exemple ampersand. Exemple:

UiLabel on ios 10

puis sur iOS 11 word wrap fonctionne d'une manière ou d'une autre mal et met ampresand à la deuxième ligne:

UiLabel on ios 11

c'est problématique car les mots plus longs, qui sont normalement placés sur la deuxième ligne maintenant, ne sont pas affichés correctement. Aucune idée de ce qui a changé? Je sais pour safeArea mais ça ne ressemble pas à une raison. Vous avez une idée de la façon de déplacer cette ampère vers le haut où est l'abondance de l'espace pour elle?

reste des paramètres: size inspector

19
demandé sur Art Kirillov 2017-09-13 17:21:17

5 réponses

il s'agit très probablement d'un changement intentionnel de la part D'Apple visant à prévenir les lignées 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 brise maintenant la ligne d'une manière telle qu'une deuxième ligne de texte comporte toujours au moins deux mots.

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

enter image description here

ici Aussi "1519110920 un" bon article à propos de "veuf"et "orphelins de texte.

28
répondu brynbodayle 2018-02-28 23:35:38

ce n'est pas vraiment une réponse, mais je tiens à ajouter une illustration de la façon dont il est un problème général, pas du tout liés à ampersands.

two UILabels

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

7
répondu David Dunham 2017-10-20 18:48:54

lancer l'application avec les arguments -NSAllowsDefaultLineBreakStrategy NO (un paramètre par défaut non documenté) semble forcer à revenir à l'ancien comportement. Alternativement, vous pouvez définir NSAllowsDefaultLineBreakStrategy à 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, de sorte que vous auriez besoin d'enregistrer une valeur supérieure après cela , ou l'insérer dans le NSArgumentDomain , ou simplement définir la valeur par défaut de façon persistante).

Apple peut considérer que L'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, il fonctionne dans les tests rapides -- vu le réglage dans NSUserDefaults et trouvé en le modifiant a modifié le comportement.

5
répondu Carl Lindberg 2018-07-06 15:23:28

il semble que le remplacement de l'espace avant l'ampère par un espace non-cassant (U+00A0) maintient l'ampère sur la même ligne. Selon la façon dont vous créez le texte de l'étiquette, cela pourrait ne pas être facile à automatiser (peut-être que vous avez vraiment besoin de l'esperluette à être sur la deuxième ligne dans certains cas).

1
répondu Geoff Hackworth 2017-10-16 08:35:57

une option peut être d'utiliser un UITextView à la place -- qui ne semble pas avoir ce comportement. Si vous définissez le NSTextContainer.lineFragmentPadding to 0, le textcontainerenset to UIEdgeInsetsZero, and turn off all scrolling (scrolllenabled, bounces, scroll indicators, etc.) il s'affichera de la même manière qu'un UILabel, mais pas avec autant de flexibilité de contrainte. Ce n'est pas une solution de rechange, mais dans certaines situations, c'est acceptable.

1
répondu Carl Lindberg 2018-03-02 05:57:25