美文网首页
iOS运用runtime全局修改UILabel的默认字体

iOS运用runtime全局修改UILabel的默认字体

作者: 管你爱不爱 | 来源:发表于2017-03-11 10:48 被阅读453次

    这是最简单方便的方法,我们可以使用runtime机制替换掉UILabel的初始化方法,在其中对label的字体进行默认设置。因为Label可以从initWithFrame、init和nib文件三个来源初始化,所以我们需要将这三个初始化的方法都替换掉。

    #import@interface UILabel (QMChangeDefaultFont)
    
    @end
    
    #import "UILabel+QMChangeDefaultFont.h"
    
    #import <objc/runtime.h>
    
    #import@implementation UILabel (QMChangeDefaultFont)
    
    /**
    
    *每个NSObject的子类都会调用下面这个方法 在这里将init方法进行替换,使用我们的新字体
    
    *如果在程序中又特殊设置了字体 则特殊设置的字体不会受影响 但是不要在Label的init方法中设置字体
    
    *从init和initWithFrame和nib文件的加载方法 都支持更换默认字体
    
    */
    
    +(void)load{
    
    //只执行一次这个方法
    
    static dispatch_once_t onceToken;
    
    dispatch_once(&onceToken, ^{
    
    Class class = [self class];
    
    // When swizzling a class method, use the following:
    
    // Class class = object_getClass((id)self);
    
    //替换三个方法
    
    SEL originalSelector = @selector(init);
    
    SEL originalSelector2 = @selector(initWithFrame:);
    
    SEL originalSelector3 = @selector(awakeFromNib);
    
    SEL swizzledSelector = @selector(QMBaseInit);
    
    SEL swizzledSelector2 = @selector(QMBaseInitWithFrame:);
    
    SEL swizzledSelector3 = @selector(QMBaseAwakeFromNib);
    
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    
    Method originalMethod2 = class_getInstanceMethod(class, originalSelector2);
    
    Method originalMethod3 = class_getInstanceMethod(class, originalSelector3);
    
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    
    Method swizzledMethod2 = class_getInstanceMethod(class, swizzledSelector2);
    
    Method swizzledMethod3 = class_getInstanceMethod(class, swizzledSelector3);
    
    BOOL didAddMethod =
    
    class_addMethod(class,
    
    originalSelector,
    
    method_getImplementation(swizzledMethod),
    
    method_getTypeEncoding(swizzledMethod));
    
    BOOL didAddMethod2 =
    
    class_addMethod(class,
    
    originalSelector2,
    
    method_getImplementation(swizzledMethod2),
    
    method_getTypeEncoding(swizzledMethod2));
    
    BOOL didAddMethod3 =
    
    class_addMethod(class,
    
    originalSelector3,
    
    method_getImplementation(swizzledMethod3),
    
    method_getTypeEncoding(swizzledMethod3));
    
    if (didAddMethod) {
    
    class_replaceMethod(class,
    
    swizzledSelector,
    
    method_getImplementation(originalMethod),
    
    method_getTypeEncoding(originalMethod));
    
    } else {
    
    method_exchangeImplementations(originalMethod, swizzledMethod);
    
    }
    
    if (didAddMethod2) {
    
    class_replaceMethod(class,
    
    swizzledSelector2,
    
    method_getImplementation(originalMethod2),
    
    method_getTypeEncoding(originalMethod2));
    
    }else {
    
    method_exchangeImplementations(originalMethod2, swizzledMethod2);
    
    }
    
    if (didAddMethod3) {
    
    class_replaceMethod(class,
    
    swizzledSelector3,
    
    method_getImplementation(originalMethod3),
    
    method_getTypeEncoding(originalMethod3));
    
    }else {
    
    method_exchangeImplementations(originalMethod3, swizzledMethod3);
    
    }
    
    });
    
    }
    
    /**
    
    *在这些方法中将你的字体名字换进去
    
    */
    
    - (instancetype)QMBaseInit
    
    {
    
    id __self = [self QMBaseInit];
    
    UIFont * font = [UIFont fontWithName:@"这里输入你的字体名字" size:self.font.pointSize];
    
    if (font) {
    
    self.font=font;
    
    }
    
    return __self;
    
    }
    
    -(instancetype)QMBaseInitWithFrame:(CGRect)rect{
    
    id __self = [self QMBaseInitWithFrame:rect];
    
    UIFont * font = [UIFont fontWithName:@"这里输入你的字体名字" size:self.font.pointSize];
    
    if (font) {
    
    self.font=font;
    
    }
    
    return __self;
    
    }
    
    -(void)QMBaseAwakeFromNib{
    
    [self QMBaseAwakeFromNib];
    
    UIFont * font = [UIFont fontWithName:@"这里输入你的字体名字" size:self.font.pointSize];
    
    if (font) {
    
    self.font=font;
    
    }
    
    }
    
    @end 
    
    /**
    
    *每个NSObject的子类都会调用下面这个方法 在这里将init方法进行替换,使用我们的新字体
    
    *如果在程序中又特殊设置了字体 则特殊设置的字体不会受影响 但是不要在Label的init方法中设置字体
    
    *从init和initWithFrame和nib文件的加载方法 都支持更换默认字体
    
    */
    

    相关文章

      网友评论

          本文标题:iOS运用runtime全局修改UILabel的默认字体

          本文链接:https://www.haomeiwen.com/subject/wleagttx.html