Xcode 6 tiene una nueva característica donde fuentes y tamaños de fuente en UILabel
, UITextField
y UIButton
se pueden ajustar automáticamente en función de la clase de tamaño de la configuración actual del dispositivo, justo en el guión. Por ejemplo, puede configurar a UILabel
para usar el tamaño de fuente 12 en configuraciones de "cualquier ancho, altura compacta" (como en iPhones en horizontal) y el tamaño 18 en configuraciones de "ancho normal, altura normal" (como en iPads ). Más información está disponible aquí:
developer.apple.com/size_class
En teoría, esta es una gran característica porque podría hacer que no sea necesario configurar mediante programación diferentes fuentes en las características de la interfaz de usuario según la configuración del dispositivo. En este momento, tengo un código condicional que establece las fuentes según el tipo de dispositivo, pero obviamente, eso significa que tengo que configurar las fuentes mediante programación en todas partes de la aplicación. Así que inicialmente estaba muy emocionado con esta función, pero descubrí que tiene un problema severo de uso real para mí (tal vez un error). Tenga en cuenta que estoy construyendo contra SDK 8 y estableciendo un objetivo de implementación mínimo de iOS 8 , por lo que esto no tiene nada que ver con la compatibilidad con versiones anteriores de iOS.
El problema es el siguiente: si establezco diferentes tamaños de fuente para diferentes clases de tamaño y uso la fuente "Sistema" proporcionada por iOS , todo funciona como se esperaba y los tamaños de fuente cambian según la clase de tamaño. Si uso una fuente personalizada proporcionada por mi aplicación (sí, la he configurado correctamente en mi paquete de aplicaciones, ya que funciona mediante programación) y configuro la fuente personalizada en una etiqueta en un guión gráfico de XCode 6 , eso también funciona como se esperaba. Pero cuando trato de usar diferentes tamaños de la fuente personalizada para diferentes clases de tamaño, en el guión gráfico, de repente no funciona. La única diferencia en la configuración es la fuente que he elegido (una personalizada frente a la fuente del sistema). En cambio, todas las fuentes aparecen en ladispositivo y simulador como la fuente predeterminada del sistema en el tamaño predeterminado , independientemente de la clase de tamaño (y verifiqué a través del depurador que está sustituyendo la fuente del sistema por la real especificada en el guión gráfico). Básicamente, la característica de clase de tamaño parece estar rota para fuentes personalizadas. Además, curiosamente, las fuentes personalizadas realmente se muestran y ajustan el tamaño correctamente en el panel "Vista previa" de XCode 6 para el controlador de vista: deja de funcionar solo cuando se ejecuta en el sistema iOS real (lo que me hace pensar que lo estoy configurando correctamente) .
Probé varias fuentes personalizadas diferentes, y no parece funcionar para ninguna de ellas, pero siempre funciona si uso "Sistema" en su lugar.
De todos modos, ¿alguien más ha visto este problema en Xcode 6 ?
Cualquier idea sobre si esto es un error en iOS 8, Xcode o algo
Estoy haciendo mal
La única solución que he encontrado, como dije, es continuar configurando las fuentes mediante programación como lo he hecho para aproximadamente tres versiones de iOS porque eso funciona.
Pero me encantaría poder utilizar esta función si pudiera hacer que funcione con fuentes personalizadas. El uso de la fuente System no es aceptable para nuestro diseño.
INFORMACIÓN ADICIONAL: A partir de Xcode 8.0, el error está corregido.
fuente
Respuestas:
Arreglo rápido:
1) Establecer fuentes como Sistema para clases de tamaño
2) Subclase UILabel y anule el método "layoutSubviews" como:
Por cierto, es una técnica muy conveniente para fuentes icónicas.
fuente
self.label.font = ...
esta manera, puede usar diferentes fuentes en diferentes lugares.Después de probar todo, finalmente me decidí por una combinación de las soluciones anteriores. Usando Xcode 7.2, Swift 2.
@IBInspectable
le permite establecer el tamaño de fuente en el StoryboarddidSet
observador, para evitar los errores delayoutSubviews()
(bucle infinito para alturas de fila de vista de tabla dinámica) yawakeFromNib()
(ver el comentario de @ cocoaNoob)@IBDesignable
@IBDesignable
no funciona detraitCollection
acuerdo con este otro artículo de pilaUIScreen.mainScreen()
lugar deself
según este artículo de pilafuente
Solución alternativa para
UILabel
: mantenga el mismo tamaño de fuente en todas las clases de tamaño, pero cambie la altura de la etiqueta en consecuencia en cada clase de tamaño. Su etiqueta debe tener habilitado el encogimiento automático. Funcionó muy bien en mi caso.fuente
adjustsFontSizeToFitWidth
parece funcionar solo para el ancho (que no puedo usar porque el texto de las etiquetas es dinámico).Este (y otros errores relacionados con las clases de tamaño de Xcode) me causaron un gran dolor recientemente, ya que tuve que pasar por un enorme archivo de guión gráfico pirateando cosas.
Para cualquier otra persona en esta posición, me gustaría agregar algo además de la respuesta de @ razor28 para aliviar el dolor.
En el archivo de encabezado de su subclase personalizada, utilice
IBInspectable
para sus atributos de tiempo de ejecución. Esto hará que estos atributos sean accesibles desde el "Inspector de atributos", visualmente justo encima de la posición predeterminada para la configuración de fuentes.Ejemplo de uso:
Esto producirá muy útilmente este resultado:
Un beneficio adicional es que ahora no tenemos que agregar los atributos de tiempo de ejecución manualmente para cada etiqueta. Esto es lo más cerca que pude llegar al comportamiento previsto de XCode. Con suerte, una solución adecuada está en camino con iOS 9 este verano.
fuente
Solución similar a la de @ razor28, pero creo que un poco más universal. Además, funciona bien en versiones anteriores de iOS.
https://gist.github.com/softmaxsg/8a3ce30331f9f07f023e
fuente
El error sigue siendo válido en XCode 7.0 GM.
La solución de Razor28 provoca bucles infinitos en algunos casos. Mi experiencia ha sido su uso junto con SwipeView .
En cambio, te sugiero que:
1) Subclase UILabel y override setFont:
2) Configure la clase personalizada de sus UILabels y luego configure las clases de tamaño de fuente usando la fuente del sistema
fuente
El problema persiste: no puede usar la función para configurar fuentes para diferentes clases de tamaño desde el generador de interfaces.
Simplemente configure la fuente según el dispositivo que desee, como se muestra a continuación:
Esto funciona perfectamente en todos los dispositivos.
fuente
Ninguno de estos funcionó para mí, pero esto sí. También debe utilizar la fuente del sistema en IB
fuente
Todavía no hay una respuesta correcta firmada. Este código funciona bien para mí. Primero debe deshabilitar el tamaño de fuente para las clases de tamaño en el generador de interfaces. En IB puede utilizar fuentes personalizadas.
fuente
Una combinación de algunas de las respuestas anteriores anteriores fue útil. Así es como resolví el error de IB a través de una extensión Swift UILabel:
fuente
Estoy usando Swift, XCode 6.4. Entonces esto es lo que hice
Ir al diseñador -> Inspector de identidad -> Establecer la clase en ExUILabel
Luego vaya al inspector de atributos en el diseñador y establezca el nombre de la fuente.
fuente
Se me ocurrió una solución aún más rápida (supongo que siempre usas tu única fuente personalizada).
Cree una categoría para UILabel e inclúyala en archivos utilizando un guión gráfico con errores con clases de tamaño y configuración de fuente dedicada para varias clases:
Simplemente use sus fuentes personalizadas en el guión gráfico. Cuando el intérprete con errores utilice la fuente del sistema en lugar de la suya, esta categoría la cambiará a su fuente personalizada.
fuente
Tuve el mismo problema y encontré uno no muy claro, ¡pero una buena solución!
fuente
fuente