ios iphone uilabel ios11

UILabel envuelve la palabra incorrecta en iOS 11



iphone ios11 (5)

Esto no es realmente una respuesta, pero quiero agregar una ilustración de cómo se trata de un problema general, no relacionado en absoluto con ampersands.

Ambos de estos UILabels tienen restricciones de ancho idénticas, y el texto es casi idéntico. Pero el segundo tiene la palabra envolver que esperaría. El primero es incorrecto, el "acerca de" puede permanecer claramente en la primera línea.

Tengo problemas con la aplicación usando XIBs sin autolayout. No sé si esta es información importante.

Tengo UILabel con 2 líneas usando ajuste de palabra. En iOS, el ajuste de 10 palabras funcionaba correctamente, y la primera línea contenía una palabra + carácter especial, por ejemplo, un signo comercial. Ejemplo:

Luego, en iOS 11, el ajuste de palabras está funcionando de alguna manera mal y pone ampresand en la segunda línea:

Esto es problemático ya que las palabras más largas, que normalmente están en segunda línea ahora no se muestran correctamente. ¿Alguna idea de lo que ha cambiado? Sé sobre SafeArea pero no parece ser una razón. ¿Alguna idea de cómo mover ese símbolo en la parte superior donde hay suficiente espacio para ello?

Resto de los ajustes:


Esto podría muy probablemente ser un cambio intencional por parte de Apple para evitar las líneas viudas. Desde una perspectiva de diseño, se prefiere evitar tener una sola palabra en una línea de texto. Así que parece que UILabel ahora rompe la línea de una manera que la segunda línea de texto siempre tiene al menos 2 palabras.

Es sorprendente que no haya documentación o manera de deshabilitar este comportamiento.

También aquí hay un buen artículo sobre texto "viudo" y "huérfano".


Parece que reemplazar el espacio antes del signo y con un espacio que no se rompa (U + 00A0) mantiene el signo en la misma línea. Dependiendo de cómo esté generando el texto para la etiqueta, esto podría no ser fácil de automatizar (tal vez realmente necesite el signo en la segunda línea en algunos casos).


Una opción puede ser usar un UITextView en su lugar, que no parece tener este comportamiento. Si configura NSTextContainer.lineFragmentPadding en 0, el textContainerInset en UIEdgeInsetsZero y desactiva todo el desplazamiento (scrollEnabled, bounces, scroll indicadores, etc.) se mostrará de manera similar a un UILabel, aunque no con tanta flexibilidad de restricción. No es un reemplazo directo, pero en algunas situaciones es aceptable.


El lanzamiento de la aplicación con los argumentos -NSAllowsDefaultLineBreakStrategy NO (una configuración por defecto no documentada) parece obligar a volver al comportamiento anterior. Alternativamente, puede configurar NSAllowsDefaultLineBreakStrategy en NO en NSUserDefaults en el inicio (Apple registra un valor predeterminado de YES para ese valor cuando se UILabel o el código de dibujo de la cadena, por lo que deberá registrar un valor superior después de eso o insertarlo en el NSArgumentDomain , o simplemente establezca el valor predeterminado de forma persistente).

Apple puede considerar esa API privada y rechazar las aplicaciones que la utilizan; No estoy seguro. No he intentado esto en una aplicación de envío. Sin embargo, funciona en pruebas rápidas: vio la configuración en NSUserDefaults y encontró que cambiarla alteró el comportamiento.