RunTime的使用-Category改變整個(gè)項(xiàng)目全部字體

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出靜安免費(fèi)做網(wǎng)站回饋大家。

  在項(xiàng)目比較成熟的基礎(chǔ)上,遇到了這樣一個(gè)需求,應(yīng)用中需要引入新的字體,需要更換所有Label的默認(rèn)字體,但是同時(shí),對于一些特殊設(shè)置了字體的label又不需要更換。乍看起來,這個(gè)問題確實(shí)十分棘手,首先項(xiàng)目比較大,一個(gè)一個(gè)設(shè)置所有使用到的label的font工作量是巨大的,并且在許多動態(tài)展示的界面中,可能會漏掉一些label,產(chǎn)生bug。其次,項(xiàng)目中的label來源并不唯一,有用代碼創(chuàng)建的,有xib和storyBoard中的,這也將浪費(fèi)很大的精力。這種情況下,我們可能會有下面兩種處理方式。

1、使用框架

        創(chuàng)建我們自己的BaseLabel類,在其中進(jìn)行默認(rèn)字體的設(shè)置,并且并不影響在使用過程中特殊設(shè)置字體的label,這種方式可以滿足我們的需求,但是并不適于我們的場景,項(xiàng)目已經(jīng)成熟,重建一個(gè)label基類,來讓所有的UILabel都換成它的工作量不會比重新設(shè)置所有l(wèi)abel字體的工作量小太多。但這也是有優(yōu)勢的,至少如果下次再換字體,我們就不用麻煩了。

2、使用runtime替換UILabel初始化方法

        這是最簡單方便的方法,我們可以使用runtime機(jī)制替換掉UILabel的初始化方法,在其中對label的字體進(jìn)行默認(rèn)設(shè)置。因?yàn)長abel可以從initWithFrame、init和nib文件三個(gè)來源初始化,所以我們需要將這三個(gè)初始化的方法都替換掉。

首先,我們創(chuàng)建一個(gè)UILabel的類別:

#import <UIKit/UIKit.h>

@interface UILabel (ChangeDefaultFont)

@end


#import "UILabel+ChangeDefaultFont.h"
#import <objc/runtime.h>
@implementation UILabel (ChangeDefaultFont)

/**
 *每個(gè)NSObject的子類都會調(diào)用下面這個(gè)方法 在這里將init方法進(jìn)行替換,使用我們的新字體
 *如果在程序中又特殊設(shè)置了字體 則特殊設(shè)置的字體不會受影響 但是不要在Label的init方法中設(shè)置字體
 *從init和initWithFrame和nib文件的加載方法 都支持更換默認(rèn)字體
 */
+(void)load{
    //只執(zhí)行一次這個(gè)方法
    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);
        //替換三個(gè)方法
        SEL originalSelector = @selector(init);
        SEL originalSelector2 = @selector(initWithFrame:);
        SEL originalSelector3 = @selector(awakeFromNib);
        SEL swizzledSelector = @selector(YHBaseInit);
        SEL swizzledSelector2 = @selector(YHBaseInitWithFrame:);
        SEL swizzledSelector3 = @selector(YHBaseAwakeFromNib);


        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);
        }
    });

}
/**
 *在這些方法中將你的字體名字換進(jìn)去
 */
- (instancetype)YHBaseInit
{
    id __self = [self YHBaseInit];
    UIFont * font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize];
    if (font) {

        if (Main_Screen_Height>540)
        {
            self.font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize-2];
        }
        else
        {
            self.font=font;
        }

    }
    return __self;
}

-(instancetype)YHBaseInitWithFrame:(CGRect)rect{
    id __self = [self YHBaseInitWithFrame:rect];
    UIFont * font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize];
    if (font) {

        if (Main_Screen_Height>540)
        {
            self.font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize-2];
        }
        else
        {
        self.font=font;
        }
    }
    return __self;
}
-(void)YHBaseAwakeFromNib{
    [self YHBaseAwakeFromNib];
    UIFont * font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize];
    if (font) {

        if (Main_Screen_Height>540)
        {
            self.font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize-2];
        }
        else
        {
            self.font=font;
        }

    }

}


@end


由于個(gè)人項(xiàng)目的原因,我的項(xiàng)目有一定特殊性 在Iphone6 plus 以上的尺寸需要壓縮字體所以用了這個(gè)方法法 檢測屏幕的長度來判斷設(shè)備型號,從而讓字體的大小減小2個(gè)字號 達(dá)到目的,在實(shí)際的需求之中,我們還可以用來更換產(chǎn)品給出的不同的字體以及字號大小

本文題目:RunTime的使用-Category改變整個(gè)項(xiàng)目全部字體
分享地址:http://muchs.cn/article36/ipgcsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、動態(tài)網(wǎng)站營銷型網(wǎng)站建設(shè)、微信公眾號定制開發(fā)、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管