Reemplazo de fuente con un clic en tiempo de ejecución de desarrollo de iOS: UILabel, fuente de reemplazo UIFont (todas reemplazadas por fuentes tripartitas)

En un proyecto reciente, me pidieron que reemplazara todas las fuentes Pingcube del sistema con fuentes tripartitas. De hecho, reemplazar todas las fuentes es relativamente más simple que reemplazar algunas fuentes. Podemos usar el tiempo de ejecución para resolverlo.

Agregar fuentes al proyecto

Agregar al proyecto

  • Arrastre la fuente al recurso del sistema, preste atención para seleccionar la opción agregar a taget

     

    agregar al objetivo

  • Abra las Fases de compilación de Target -> Copiar recurso de paquete para ver si la fuente está debajo de esta pestaña. Si no hace clic en + para agregarla.

     

    Copiar recurso de paquete

  • Luego haga clic en la opción de información, agregue un campo Fuentes proporcionadas por la aplicación Esta es una matriz y agregue elementos a la matriz.Cada elemento es el nombre de la fuente.

     

    info.plist

Usar fuente

  • Nota: El archivo .tff agregado puede no ser el nombre real de la fuente. Necesitamos recorrer para encontrar la fuente recién agregada. Use el código para atravesar para encontrarlo y agregarlo al método didFinishLaunchingWithOptions de appDelegate.
for(NSString *fontFamilyName in [UIFont familyNames]) {
       NSLog(@"fontFamilyName:'%@'",fontFamilyName);
       for(NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
           NSLog(@"    font:'%@'",fontName);
       }
       NSLog(@"*****************************");
   }

Área de cambio de fuente (cambiar una fuente UILabel)

  • Puede usar esta fuente tripartita cuando encuentre el nombre de la fuente, puede usarla [UIFont fontWithName:@"" size:];

Cambiar la fuente de todo el texto

Cómo reemplazar UILabel

  • Cuando el autor recibió la solicitud para reemplazar la fuente, el proyecto estaba casi terminado. Obviamente, es imposible reemplazar una sola UILabel. La búsqueda en línea encontró que puede usar el tiempo de ejecución para reemplazar la UILabel en tiempo de ejecución.

  • El método + load se llama cuando se carga la clase. Cuando se inicia la aplicación iOS, se cargarán todas las clases, por lo que se llamará al método + load de cada clase.

  • Reemplace los posibles métodos de inicialización de UILabel en el método + load y establezca la fuente de UILabel en el nuevo método, de modo que se reemplacen todas las fuentes UILabel.

  • Nota: En la reescritura + carga cuando [super load]se usa la primera llamada al método de inicialización de la clase principal para crear un GCD dispatch_once_t, asegúrese de que el código se ejecute solo una vez.

  • Tanto el método de inicialización del sistema como el método personalizado son de tipo SEL en tiempo de ejecución . Cree dos métodos. Para implementar un método personalizado para establecer la fuente. Por ejemplo:

SEL originalSelector = @selector(init);
SEL swizzledSelector = @selector(QQInit);
  • Obtenga dos métodos de instancia por separado
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

  • Entonces podemos reemplazar directamente los dos métodos

method_exchangeImplementations(originalMethod, swizzledMethod);
  • Implementación de métodos personalizados
- (instancetype)QQInit {
   id __self = [self QQInit];
   UIFont * font = [UIFont fontWithName:@"FZSEK--GBK1-0" size:self.font.pointSize];
   if (font) {
       self.font=font;
   }
   return __self;
}

Cómo reemplazar UIFont

  • Después de completar lo anterior, encontraremos que algunas de las fuentes no han sido reemplazadas. Puede ser porque hemos llamado a varios métodos después de inicializar UILabel. Estos métodos tienen el efecto de configurar systemFont. Por lo tanto, se establece en la fuente Pingfang del sistema. Entonces tenemos que usar el tiempo de ejecución para reemplazar estos métodos de UIFont.
    + (UIFont *)systemFontOfSize:(CGFloat)fontSize;
    + (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize;
    + (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize;

  • El método de reemplazo es el mismo, pero estos métodos son métodos de clase , por lo que no se pueden usar cuando se class_getInstanceMethodusa getMethod .class_getClassMethod

  • Implementación de métodos personalizados

+(UIFont *)QQsystemFontOfSize:(CGFloat)fontSize {
   UIFont * font = [UIFont fontWithName:@"FZSEK--GBK1-0" size:fontSize];
   if (!font) {
       return [self QQsystemFontOfSize:fontSize];
   }
   return font;
}

Prueba

UILabel *lab = [[UILabel alloc] initWithFrame:self.view.bounds];
lab.text = @"按时到合肥拉萨交电话费拉还是快递费卢卡斯 阿萨德会尽快了粉红色的拉客户放假啦是肯定会发生良好的会计法哈收了的看法和沙拉肯定会发了卡萨丁";
lab.font = [UIFont systemFontOfSize:19];
lab.numberOfLines = 0;
[self.view addSubview:lab];
  • El código anterior establece el texto y también establece el tamaño del texto del sistema, pero no nos impide cambiar la fuente.

 

efecto


Artículo de referencia -> Dirección
GitHub -> Dirección de demostración

Enlace: https://www.jianshu.com/p/05909ca4df31

Supongo que te gusta

Origin blog.csdn.net/wangletiancsdn/article/details/99866251
Recomendado
Clasificación