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:
Ensuite, sur iOS 11, le retour à la ligne fonctionne mal et met l'ampresand à la deuxième ligne:
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?
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.
Voici également n bon article sur le texte "veuf" et "orphelin".
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.
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.
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.
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.
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).