UILabel falschen Zeilenumbruch in iOS 11
Ich habe ein problem mit der Anwendung mit XIBs ohne autolayout. Ich weiß nicht, ob dies ist eine wichtige information.
Habe ich UILabel mit 2 Zeilen mit Zeilenumbruch. In iOS 10 Zeilenumbruch richtig gearbeitet wurde, und die erste Zeile enthielt ein Wort + Sonderzeichen, zum Beispiel kaufmännisches und-Zeichen. Beispiel:
Dann auf iOS-11 word-wrap arbeitet irgendwie falsch und stellt ampresand zu der zweiten Zeile:
Dies ist problematisch, da mehr Worte, dass in der Regel montiert auf der zweiten Linie nun nicht richtig angezeigt. Keine Ahnung, was sich geändert hat? Ich weiß, über safeArea aber es sieht nicht wie Grund. Irgendwelche Ideen, wie sich zu bewegen, dass kaufmännisches und-Zeichen nach oben, wo ist Platz für ihn?
Rest der Einstellungen:
- Ich traf das gleiche Problem und kann nur vermuten: Es scheint, der text-wrapping-Algorithmus hat sich in iOS 11, so dass das Ergebnis ist mehr symmetrisch/sieht mehr geboxt.
- Sieht aus wie wir haben das gleiche Problem auch. Dies scheint wie ein bug, weil UILabel hat historisch gewesen verwendet in Situationen, wo wir wollen, zu simulieren typische Wort-Prozessor (oder web-browser) word wrap, nicht herauszufinden, die kleinste box, die halten alle den text.
- Ich sehe das gleiche Problem (mit kaufmännisches und). Wenn ich das erstellen der app mit Xcode 8 (gegen iOS 10), dann laufen die auf iOS-11 sehe ich die neue word-wrapping Verhalten. Also, auch wenn notionally bietet rückwärts-Kompatibilität mit iOS 10 app iOS 11 ist der Zeilenumbruch anders.
- Ich glaube, es ist ein bug um dieses Verhalten zu erzwingen und schließlich die Einreichung 36021540 mit Apple. Wenn jemand Dateien können Sie auf diesen.
- Dieses Problem kommt von ios 11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte dies sehr wahrscheinlich eine absichtliche änderung durch Apple zu verhindern, dass verwitwete Linien. Aus einer design-Perspektive, ist es bevorzugt, um zu vermeiden, dass ein einzelnes Wort in einer Zeile text. Es scheint also, dass UILabel bricht nun die Linie in einer Weise, dass die zweite Zeile der text hat immer mindestens 2 Wörter drauf.
Ist es verwunderlich, dass es keinerlei Dokumentation oder Weg, um dieses Verhalten zu deaktivieren, wenn.
Auch hier ist ein guter Artikel über "verwitwet" und "verwaiste" text.
Start der app mit den Argumenten
-NSAllowsDefaultLineBreakStrategy NO
(eine undokumentierte Einstellung der Standardwerte) scheint zu zwingen, zurück zu den alten Verhalten. Alternativ können SieNSAllowsDefaultLineBreakStrategy
zuNO
imNSUserDefaults
beim Start (Apple registriert, StandardwertYES
für diesen Wert, wennUILabel
oder die string-Zeichnung code initialisiert wird, wie es scheint, so würden Sie brauchen, registrieren Sie einen übergeordneten Wert, oder legen Sie es in denNSArgumentDomain
oder legen Sie die Standard-persistent).Apple die Auffassung vertreten, dass private API und apps ablehnen, die es benutzen; ich bin mir nicht sicher. Ich habe nicht versucht, diese in ein Versand-app. Aber es funktioniert in schnellen testen-sah die Einstellung in
NSUserDefaults
und fand, es zu verändern, verändert das Verhalten.[defaults setVolatileDomain:dict forName:NSArgumentDomain]
, so ist es äquivalent zu einer Laufzeit argument-das ist nicht persistent auf der Festplatte, aber immer noch übersteuert Apple. Es könnte sogar funktionieren, wenn Sie nur vorübergehend festlegen, dass bei einem UILabel drawRect überschreiben, um es nur in einigen Situationen.Dies ist nicht wirklich eine Antwort, aber ich möchte hinzufügen, eine illustration dafür, wie es ist ein generelles problem, überhaupt nicht Bezug auf kaufmännische und-Zeichen.
Diese beiden UILabels haben identische Breite-Einschränkungen, und der text ist fast identisch. Aber der zweite hat den Zeilenumbruch, den ich erwarten würde. Das erste ist falsch, das "über" kann klar bleiben Sie auf der ersten Zeile.
Scheint es, dass anstelle der Leerzeichen vor das kaufmännische und-Zeichen mit einem non-breaking space (U+geschützte Leerzeichen 00A0) hält das kaufmännische und-Zeichen auf der gleichen Zeile. Je nachdem, wie Sie die Erzeugung der text für die Beschriftung, das ist vielleicht nicht leicht zu automatisieren sind (vielleicht haben Sie wirklich brauchen, das kaufmännische und-Zeichen auf der zweiten Zeile in einigen Fällen).
Einer option kann die Verwendung einer UITextView statt-das scheint nicht auf dieses Verhalten haben. Wenn Sie die NSTextContainer.lineFragmentPadding 0 textContainerInset zu UIEdgeInsetsZero, und schalten Sie alle scrollen (scrollEnabled, springt, scroll-Indikatoren, etc.) es zeigt, ähnlich wie in einem UILabel, wenn auch nicht mit so viel Einschränkung der Flexibilität. Es ist kein drop-in Ersatz, sondern in einigen Situationen ist es akzeptabel.
selectable
undeditable
Eigenschaften als gut. AusschaltenuserInteractionEnabled
würde auch nicht Schaden.Als eine einfache (hacky) zu umgehen, können Sie oft auf das richtige Verhalten mit UILabel durch hinzufügen von Leerzeichen am Ende des Textes. Mit deinem Beispiel:
Umschließt die neue (unerwünschte) Möglichkeit:
"oneText & two."
Umschließt die alte Weise:
"oneText & two. "
(Hinweis: die 2 zusätzlichen Leerzeichen am Ende der Zeichenfolge)Der offensichtliche Nachteil ist, wenn diese zusätzlichen Räume gezwungen, eine neue Linie von selbst, aber für so etwas einfaches wie ein Titel es oft genug.