公司主營業(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)很大的精力。這種情況下,我們可能會有下面兩種處理方式。
創(chuàng)建我們自己的BaseLabel類,在其中進(jìn)行默認(rèn)字體的設(shè)置,并且并不影響在使用過程中特殊設(shè)置字體的label,這種方式可以滿足我們的需求,但是并不適于我們的場景,項(xiàng)目已經(jīng)成熟,重建一個(gè)label基類,來讓所有的UILabel都換成它的工作量不會比重新設(shè)置所有l(wèi)abel字體的工作量小太多。但這也是有優(yōu)勢的,至少如果下次再換字體,我們就不用麻煩了。
這是最簡單方便的方法,我們可以使用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)