Xcode 6 tiene una nueva función en fuentes y tamaños de fuente en UILabel, UITextField, y UIButton puede ajustar de forma automática en función del tamaño de la clase de la actual configuración del dispositivo, justo en el guión gráfico. Por ejemplo, puede establecer un UILabel a utilizar el tipo de letra de tamaño 12 en «cualquier anchura, compacto altura» (como en el iphone en horizontal) y configuraciones de tamaño de 18 «regular la anchura, la altura normal» de las configuraciones (como en el ipad). Más información está disponible aquí:

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/Size-ClassSpecificLayout.html

Esto es realmente una gran función en la teoría ya que no podría hacer innecesario establecer mediante programación diferentes fuentes en la interfaz de usuario de funciones basadas en la configuración del dispositivo. Ahora, tengo algo de 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 en toda la aplicación. Así que al principio me sentí muy emocionado acerca de esta característica, pero he encontrado que tiene un grave problema en el uso real para mí (tal vez un error). Tenga en cuenta que estoy en contra de la construcción de SDK 8 y el establecimiento de un mínimo de destino de la implementación de iOS 8 así que esto no tiene nada que ver con la compatibilidad con versiones antiguas de iOS.

El problema es este:
Si puedo configurar los diferentes tamaños de fuente para las diferentes clases de tamaño, y utilizar el «Sistema» font iOS, todo funciona como se esperaba y los tamaños de letra de cambio basado en el tamaño de la clase. Si puedo utilizar una fuente personalizada proporcionada por mi aplicación (sí, lo he configurado correctamente en mi paquete de la aplicación, ya que funciona mediante programación) y establecer el tipo de letra personalizado con una etiqueta en un XCode 6 storyboard, que 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 (uno personalizado frente a la fuente del Sistema). En su lugar, todas las fuentes se muestran en el dispositivo y el simulador, como la fuente predeterminada del sistema en el tamaño predeterminado, independientemente del tamaño de clase (y he verificado a través del depurador que es la sustitución de la fuente del sistema para el real especificado en el guión gráfico). Así que, básicamente, el tamaño de la clase característica parece ser roto por fuentes personalizadas. También, curiosamente, las fuentes personalizadas en realidad la pantalla y ajustar el tamaño correctamente en el XCode 6 «vista previa» panel del controlador de vista: es sólo cuando se ejecuta en el actual sistema iOS que deja de funcionar (lo que me hace pensar que estoy configurando correctamente).

He probado con varios diferentes fuentes personalizadas y no parece funcionar para cualquiera de ellos, pero siempre funciona si uso «Sistema» en su lugar.

De todos modos, alguien lo visto este problema en Xcode 6? Alguna idea de si esto es un bug en iOS 8, Xcode, o algo estoy haciendo mal? La única solución que he encontrado, como he dicho, es continuar establecer mediante programación las fuentes como he estado por alrededor de 3 versiones de iOS, debido a que no funciona. Pero me encantaría ser capaz de utilizar esta función si yo pudiera llegar a trabajar con fuentes personalizadas. El uso de la fuente del Sistema no es aceptable para nuestro diseño.


INFO ADICIONAL:
Como de Xcode 8.0, el bug está solucionado.

  • Tengo el mismo problema. Configuración de una fuente personalizada basada en el tamaño de la clase no parece funcionar. Extrañamente, el mismo código se reproduce correctamente en Xcode y funciona muy bien en iOS 7.
  • Yo no había probado en iOS 7, ya que la nueva versión de mi aplicación gotas de soporte para iOS 7, pero que la información que se me hace más seguro de que es sólo un error en iOS 8. Por ahora, sólo estoy ajuste de todas las fuentes personalizadas mediante programación, pero voy a considerar la presentación de un error de Apple.
  • Puedo confirmar que este es el caso de xCode 6.1 (6A1052d) la app store de liberación.
  • El informe de error que mina fue marcado como un duplicado de la todavía está «abierto» con Apple, de acuerdo a su sistema.
  • No es una solución, pero he conseguido solucionar el problema, el uso de una Categoría. Mi categoría UILabel+Fuente.h (tengo uno para botones) contiene el código siguiente. -(void)awakeFromNib { float size = [self.fuente pointSize]; auto.font = [UIFont fontWithName:@»YourCustomFont» tamaño:tamaño]; } por Lo tanto, esto nos permite utilizar las clases de tamaño con el de la fuente del Sistema para establecer los valores de punto en diferentes clases de tamaño, y la categoría se asegura de que la fuente correcta es conjunto. Tal vez usted podría dar que ir hasta que Apple lance una actualización?
  • Sí, que es un decente solución para el problema, al menos de esta manera usted no tiene que establecer en todas partes. Me gusta. Por desgracia, se vuelve más complejo si se necesitan tener varias fuentes diferentes en diferentes lugares. Todavía quiero la flexibilidad de ser capaz de configurar en el guión gráfico, así que probablemente voy a dejar como está hasta que salen con una solución para este bug.
  • usted no debe reemplazar método de sistema de awakeFromNib en su categoría. En lugar de crear un método en su categoría y llame para cualquiera que sea la etiqueta que desea establecer o, de la subclase de su etiqueta.
  • Todavía no resuelto en Xcode 6.3.1. Estoy enojado por esto.
  • Como @dijo Harry aún no funciona en el v6.3.1. Va a pasar mucho tiempo haciendo todo mediante programación. 7 meses y todavía no parcheado … en Lugar de pensar sólo en ganar más dinero (los precios van para arriba en todos sus productos), se debe empezar a pensar acerca de las personas, gracias a que son capaces de hacer que el dinero…
  • Todavía nada en 6.3.2. Tuve que ir a través de una muy grande el archivo de guión gráfico hacking cosas. Por ahora creo que sólo podemos esperar para iOS 9 🙂
  • Mismo aquí con Xcode 6.3.2.
  • Todavía no funciona con Xcode 7 beta 5
  • Todavía no funciona con Xcode 7 final. No entiendo por qué Apple no lo soluciona.
  • Visto el informe de error que hice poco después de la liberación de iOS 8, y el error que la mina fue cerrada como un duplicado de la todavía está abierta. Me gustaría animar a otros a informar de ello en el fin de tratar de obtener un poco de presión sobre ellos para solucionarlo. Probablemente no se está priorizando para solucionarlo simplemente porque no hay una «solución» (es decir, diferentes formas de hacer lo mismo mediante programación), pero estoy sorprendido que no se fija en iOS 9 ya que hace Que uno de sus principales desarrollador de nuevo-amistoso características de iOS 8 y mucho menos útil.
  • Yo también tengo este problema con UIButtons, que no se puede invalidar setFont en como se trata de un método en la etiqueta del botón, no el propio botón. Alguna idea?
  • Todavía un bug en iOS 9 Xcode 7 (no estoy seguro de la versión exacta, no a mi OS X máquina de cajero automático)
  • todavía no está trabajando en Xcode iOS 7.2 9.2
  • todavía no está trabajando en Xcode 7.2.1 iOS 9.2
  • todavía no funciona…. lo que es un extraño error…. apple debería solucionar el problema tan pronto como sea posible
  • Todavía no funciona
  • Nadie archivo de un radar acerca de este bug?
  • Presentó un radar, todavía no funciona en 7.3.1 iOS 9.3.
  • Apple actualiza mi informe de fallos: el fallo original del informe fue cerrado. Voy a probar con la última Xcode construir cuando puedo.
  • Como de Xcode 8.0 (8A218a) puedo decir que el fallo se ha ido 🙂
  • Ahora funciona bastante bien con Xcode 8:) gran trabajo de Apple…
  • De alguna manera este error efectos todavía están presentes en Xcode 10. Me puse la fuente del sistema en punta con múltiples clase de tamaño de las fuentes para una etiqueta, y reemplazar mediante programación para asegurarse de fuente correcta se muestra en tiempo de ejecución mediante awakeWithNib, muestra de la fuente del sistema en su lugar.

InformationsquelleAutor mnemia | 2014-10-02

14 Comentarios

  1. 40

    Rápida revisión:

    1) Conjunto de fuentes como el Sistema de clases de tamaño

    Personalizado Tamaño de Fuentes en Xcode 6 Clases de Tamaño no funciona correctamente con Fuentes Personalizadas

    2) Subclase UILabel y reemplazar «layoutSubviews» método como:

    - (void)layoutSubviews
    {
      [super layoutSubviews];
    
       //Implement font logic depending on screen size
        if ([self.font.fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location == NSNotFound) {
            NSLog(@"font is not bold");
            self.font = [UIFont fontWithName:@"Custom regular Font" size:self.font.pointSize];
        } else {
            NSLog(@"font is bold");
            self.font = [UIFont fontWithName:@"Custom bold Font" size:self.font.pointSize];
        }
    
    }

    Por el camino, es muy conveniente técnica para icónico fuentes

    • Mientras que esta es una buena solución si la fuente que se utiliza en toda la aplicación es la misma, es un poco menos conveniente si usted necesita para utilizar diferentes fuentes en diferentes lugares, porque entonces usted tiene que tener diferentes subclases, etc. En mi caso, yo ya había configuración programática de las fuentes, y hay un montón de maneras diferentes que usted puede hacer. Pero el punto de mi pregunta no es para preguntar cómo hacer esto mediante programación: es preguntar por qué esto no funciona correctamente el uso de Storyboards (es una Manzana error).
    • Estoy de acuerdo. Mi objetivo es sólo para mostrar una forma de cómo manejar ese error.
    • Las grandes obras. Usted no necesita subclase UILabel, sin embargo, usted puede simplemente reemplazar este método en la vista que contiene la etiqueta y hacer self.label.font = ... de Esta manera puede utilizar diferentes fuentes en diferentes lugares.
    • O puede establecer un @IBInspectable, para almacenar el nombre de la fuente, la reutilización de la misma etiqueta personalizada de la clase y la solicitud de diferentes fuentes directamente en el guión gráfico.
    • Hay una solución similar para UITextField?
    • Yo no puedo conseguir que esto funcione, he creado una subclase, configurar el auto.de la etiqueta.fuente y el conjunto de la subclase en IB y de mi propiedad tomas variable de tipos de objeto, cualquier otra sugerencia?
    • Funciona a la perfección para mí. Pero he utilizado - (id)initWithCoder:(NSCoder*)coder { self = [super initWithCoder:coder]; if (self) { self.font = [UIFont fontWithName:@"Custom-font-name" size:self.font.pointSize]; } return self; } en Lugar de - (void)layoutSubviews
    • el trabajo para mí iOS8/9 Versión de xCode 7.1.1. Pero NO te OLVIDES para cambiar la fuente del Sistema
    • Funciona con fuentes personalizadas ya que Xcode 8:)

  2. 17

    Después de intentar todo, yo finalmente se estableció en una combinación de las anteriores soluciones. Con Xcode 7.2, Swift 2.

    import UIKit
    
    class LabelDeviceClass : UILabel {
    
        @IBInspectable var iPhoneSize:CGFloat = 0 {
            didSet {
                if isPhone() {
                    overrideFontSize(iPhoneSize)
                }
            }
        }
    
        @IBInspectable var iPadSize:CGFloat = 0 {
            didSet {
                if isPad() {
                    overrideFontSize(iPadSize)
                }
            }
        }
    
        func isPhone() -> Bool {
            //return UIDevice.currentDevice().userInterfaceIdiom == .Phone
            return !isPad()
        }
    
        func isPad() -> Bool {
            //return UIDevice.currentDevice().userInterfaceIdiom == .Pad
            switch (UIScreen.mainScreen().traitCollection.horizontalSizeClass, UIScreen.mainScreen().traitCollection.verticalSizeClass) {
            case (.Regular, .Regular):
                return true
            default:
                return false
            }
        }
    
        func overrideFontSize(fontSize:CGFloat){
            let currentFontName = self.font.fontName
            if let calculatedFont = UIFont(name: currentFontName, size: fontSize) {
                self.font = calculatedFont
            }
        }
    
    }
    • @IBInspectable le permite establecer el tamaño de fuente en el Guión gráfico
    • Utiliza un didSet observador, para evitar los riesgos de layoutSubviews() (bucle infinito para la dinámica de la vista de tabla de la altura de las filas) y awakeFromNib() (ver @cocoaNoob del comentario)
    • Utiliza el tamaño de las clases en lugar de que el dispositivo de lenguaje, en la esperanza de eventualmente el uso de este con @IBDesignable
    • Tristemente, @IBDesignable no funciona con traitCollection de acuerdo a este otro pila artículo
    • El rasgo de la colección de instrucción switch se realiza en UIScreen.mainScreen() en lugar de self por este pila artículo
    • La mejor respuesta, Pero tristemente bajo Votado..Gracias
  3. 9

    Solución para UILabel: mantener el mismo tamaño de letra en todas las Clases de Tamaño, pero en lugar de cambiar su etiqueta de altura en consecuencia en cada Clase de Tamaño. Su etiqueta debe tener la reducción automática habilitada. Funcionó muy bien en mi caso.

    • Yo era capaz de hacer la misma cosa por cambiar mi ancho de la etiqueta en cada Clase de Tamaño. Buen consejo!
    • No tuve la fuente para reducir mediante el establecimiento de un menor altura fija para mi UILabel, exactamente cómo comenzaste a trabajar? adjustsFontSizeToFitWidth parece funcionar sólo para el ancho (que no puedo utilizar porque el texto de las etiquetas es dinámica).
    • Tengo el mismo problema con ajustar para adaptarse a la anchura de
    • Terminé de ajuste de la altura de la restricción de la Etiqueta, en proporción a la altura de la superview. Que funciona bien como establece el «Líneas» de los parámetros de la Etiqueta en IB a 0.
  4. 8

    Este (y otros Xcode – Clases de Tamaño, relacionado con el error me causó algunos problemas graves de dolor recientemente como yo tenía que ir a través de un enorme archivo de guión gráfico hacking cosas.

    Para cualquier otra persona en esta posición, me gustaría añadir algo en la parte superior de @razor28 la respuesta para aliviar el dolor.

    En el archivo de encabezado de su subclase personalizada, utilice IBInspectable para su tiempo de ejecución de los atributos. Esto hará que estos atributos accesibles a partir de los Atributos «Inspector», visualmente justo encima de la posición por defecto de la configuración de las fuentes.

    Ejemplo de uso:

    @interface MyCustomLabel : UILabel
    
        @property (nonatomic) IBInspectable NSString *fontType;
        @property (nonatomic) IBInspectable CGFloat iphoneFontSize;
        @property (nonatomic) IBInspectable CGFloat ipadFontSize;
    
    @end

    Esta muy amablemente, producirá la siguiente salida:

    Personalizado Tamaño de Fuentes en Xcode 6 Clases de Tamaño no funciona correctamente con Fuentes Personalizadas

    Un beneficio añadido es que ahora no tenemos que añadir el tiempo de ejecución de los atributos manualmente para cada etiqueta. Esto es lo más cercano que podría llegar a XCode de la intención de comportamiento. Esperemos que una adecuada revisión se encuentra en su camino con iOS 9 este verano.

    • He añadido como por su instrucción, pero no soy capaz de encontrar el acceso de los Atributos «Inspector» visualmente en el xib entonces, ¿cómo lograrlo ?
  5. 3

    Solución Similar a @razor28 uno, pero creo que un poco más universal. También, funciona bien en anteriores versiones de iOS

    https://gist.github.com/softmaxsg/8a3ce30331f9f07f023e

    • Y claro, se puede establecer la propiedad overrideFontName en el Interface Builder, que permite evitar escribir código innecesario
    • Esto no funciona para mí, hice una lista de todas las fuentes instaladas en el método anterior y mi fuente estaba en la lista y asignado en la variable, pero no alterar la fuente de mostrar en la etiqueta en el simulador, y yo supongo que el dispositivo
  6. 3

    El error es aún válida en XCode 7.0 GM.

    Razor28 la solución de las causas de los bucles infinitos en algunos casos. Mi experiencia ha sido con su uso en conjunción con SwipeView.

    Lugar, sugiero que usted:

    1) Subclase UILabel y reemplazar setFont:

    - (void)setFont:(UIFont *)font
    {
        font = [UIFont fontWithName:(@"Montserrat") size:font.pointSize];
        [super setFont:font];
    }

    2) Conjunto de la clase personalizada de su UILabels y, a continuación, establecer el tamaño de fuente clases mediante el uso de la fuente del Sistema

    Personalizado Tamaño de Fuentes en Xcode 6 Clases de Tamaño no funciona correctamente con Fuentes Personalizadas

    • Parece que no funciona en las últimas versiones Beta de.
    • Se refiere a la solución o el sencillo XCode manera? Si la primera puede usted por favor especifique la versión, así que intenta reproducirlo?
    • Parece que he estado usando mal la fuente nombre de la familia de todos los tiempos. Resulta que, en tal caso, las fuentes se restablece a una fuente del sistema con 14.0 pinta de tamaño. Mi mal. Pero podría ser útil a los demás!
    • No me funciona
  7. 0

    El problema es que todavía hay que no se puede utilizar la función de establecer las Fuentes para las diferentes clases de tamaño de interface builder.

    Sólo fuente de conjunto basada en el dispositivo que usted quiere como a continuación:

    if (Your Device is iPAd) //For iPad
    {
       [yourLabel setFont:[UIFont fontWithName:@"FontName" size:FontSize]]; 
    }
    else  //For Other Devices then iPad
    {
       [yourLabel setFont:[UIFont fontWithName:@"FontName" size:FontSize]]; 
    }

    Esto funciona perfectamente en todos los dispositivos.

  8. 0

    Ninguno de estos trabajado para mí, pero este lo hizo.
    También es necesario utilizar el sistema de fuentes en IB

    #import <UIKit/UIKit.h>
    
    @interface UILabelEx : UILabel
    
    
    @end
    
    #import "UILabelEx.h"
    #import "Constants.h"
    
    @implementation UILabelEx
    
    - (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
        [super traitCollectionDidChange: previousTraitCollection];
    
        self.font = [UIFont fontWithName:APP_FONT size:self.font.pointSize];   
    }
    @end
  9. 0

    Todavía no firmó respuesta correcta. Este código funciona muy bien para mí. Debe deshabilitar el tamaño de fuente para las clases de tamaño en el interface builder primera. En IB puede utilizar tipo de letra personalizado.

    - (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
        [super traitCollectionDidChange: previousTraitCollection];
    
        if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
            || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass) {
    
             self.textField.font = [UIFont fontWithName:textField.font.fontName size:17.f];
    
        }
    }
  10. 0

    Una combinación de algunas de las respuestas anteriores fueron útiles. He aquí cómo he resuelto el IB error a través de un Swift UILabel extensión:

    import UIKit
    
    //This extension is only required as a work-around to an interface builder bug in XCode 7.3.1
    //When custom fonts are set per size class, they are reset to a small system font
    //In order for this extension to work, you must set the fonts in IB to System
    //We are switching any instances of ".SFUIDisplay-Bold" to "MuseoSans-700" and ".SFUIDisplay-Regular" to "MuseoSans-300" and keeping the same point size as specified in IB
    
    extension UILabel {
        override public func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
            super.traitCollectionDidChange(previousTraitCollection)
    
            if ((traitCollection.verticalSizeClass != previousTraitCollection?.verticalSizeClass) || traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass) {
                //let oldFontName = "\(font.fontName)-\(font.pointSize)"
    
                if (font.fontName == systemFontRegular) {
                    font = UIFont(name: customFontRegular, size: (font?.pointSize)!)
                    //xlog.debug("Old font: \(oldFontName) -> new Font: \(font.fontName) - \(font.pointSize)")
                }
                else if (font.fontName == systemFontBold) {
                    font = UIFont(name: customFontBold, size: (font?.pointSize)!)
                    //xlog.debug("Old font: \(oldFontName) -> new Font: \(font.fontName) - \(font.pointSize)")
                }
            }
        }
    }
  11. -1

    Estoy usando Swift, XCode 6.4. Así que esto es lo que yo hice

    import Foundation
    import UIKit
    
        @IBDesignable class ExUILabel: UILabel {
    
            @IBInspectable var fontName: String = "Default-Font" {
                didSet {
                    self.font = UIFont(name: fontName, size:self.font.pointSize)
                }
            }
    
            override func layoutSubviews() {
                super.layoutSubviews()
                self.font = UIFont(name: fontName, size:self.font.pointSize)
            }
        }
    1. Goto Diseñador -> Identidad Inspector -> Conjunto de la clase a ExUILabel

    2. A continuación, vaya al Atributo de inspector en el diseñador y establecer el nombre de la fuente.

  12. -1

    Me he encontrado con aún más rápido fix (supongo que usted utilice siempre su fuente personalizada).

    Crear una categoría para UILabel y se incluyen en los archivos utilizando buggy storyboard con clases de tamaño y dedicado configuración de fuente para las diferentes clases:

    @implementation UILabel (FontFixForSizeClassesAppleBug)
    
    - (void)layoutSubviews
    {
        [super layoutSubviews];
        if([[UIFont systemFontOfSize:10].familyName isEqualToString:self.font.familyName]) {
            //workaround for interface builder size classes bug which ignores custom font if various classes defined for label: http://stackoverflow.com/questions/26166737/custom-font-sizing-in-xcode6-size-classes-not-working-properly-w-custom-fonts
            self.font = [UIFont fontWithName:@"YOUR_CUSTOM_FONT_NAME" size:self.font.pointSize];
        }
    }
    
    @end

    Sólo tiene que utilizar sus fuentes personalizadas en el guión gráfico. Cuando buggy intérprete sistema de uso de la fuente en lugar de su propio de esta categoría, cambiará a la fuente personalizada.

  13. -6

    Tuve el mismo problema y encontré uno, no muy claro, pero excelente solución!

    1. Primero ajustar el tamaño de fuente en el guión gráfico con el sistema de nombre de fuente.
    2. A continuación, esta etiqueta que se puede asignar una etiqueta de 100 a 110 (o más, pero 10 siempre fue suficiente para mí en una vista controlador).
    3. A continuación, poner este código para el VC del archivo de origen y no olvide cambiar el nombre de la fuente. Código swift.
    override func viewDidLayoutSubviews() {
        for i in 100...110 {
            if let label = view.viewWithTag(i) as? UILabel {
                label.font = UIFont(name: "RotondaC-Bold", size: label.font.pointSize)
            }
        }
    }
    • No utilice etiquetas. Uso IBOutlets. Las etiquetas son malos. Ver la WWDC 2015 sesión 231: «Si usted está utilizando la Vista Con la Etiqueta o en el Conjunto de la Etiqueta de UIView API y código de envío, me voy a animar a alejarse de eso. Como un reemplazo de este, declarar propiedades en sus clases, y entonces usted tendrá real de las conexiones de los puntos de vista que usted necesita más tarde.»
    • que triste que esta solución no es perfecta, pero funciona!
  14. -8
    • agregar las Fuentes proporcionadas por la aplicación en su aplicación .plist
    • agregar tu .archivo ttf punto 0
    • utilizar [UIFont fontWithName:»ejemplo.ttf» tamaño:10]
    • Esto no es una respuesta a este problema. Obviamente, usted puede usar fuentes personalizadas mediante programación, pero lo que mi pregunta se refiere a que es un bug en iOS 8, que impide a las fuentes personalizadas de cambiar automáticamente dependiendo del tamaño de la clase.

Dejar respuesta

Please enter your comment!
Please enter your name here