iOS App開發(fā)中修改UILabel默認(rèn)字體的方法
在項(xiàng)目比較成熟的基礎(chǔ)上,遇到了這樣一個(gè)需求,應(yīng)用中需要引入新的字體,需要更換所有Label的默認(rèn)字體,但是同時(shí),對(duì)于一些特殊設(shè)置了字體的label又不需要更換。乍看起來,這個(gè)問題確實(shí)十分棘手,首先項(xiàng)目比較大,一個(gè)一個(gè)設(shè)置所有使用到的label的font工作量是巨大的,并且在許多動(dòng)態(tài)展示的界面中,可能會(huì)漏掉一些label,產(chǎn)生bug。其次,項(xiàng)目中的label來源并不唯一,有用代碼創(chuàng)建的,有xib和storyBoard中的,這也將浪費(fèi)很大的精力。這種情況下,我們可能會(huì)有下面兩種處理方式。
一、普通方法
在一個(gè)UILabel 使用不同的顏色或不同的字體來體現(xiàn)字符串,在iOS 6 以后我們可以很輕松的實(shí)現(xiàn)這一點(diǎn),官方的API 為我們提供了UILabel類的attributedText, 使用不同顏色和不同字體的字符串,我們可以使用NSAttributedText 和 NSMutableAttributedText 類來實(shí)現(xiàn)。
現(xiàn)實(shí)代碼:
.h 文件
@interface ViewController : UIViewController
.m文件 在viewDidLoad方法中添加以下代碼:
@property (nonatomic, strong) IBOutlet UILabel *attrLabel;
- (IBAction)next:(id)sender;
@end
self.title = @"For iOS 6 & later";
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"Using NSAttributed String"];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(0,5)];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(6,12)];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(19,6)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Arial-BoldItalicMT" size:30.0] range:NSMakeRange(0, 5)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:30.0] range:NSMakeRange(6, 12)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Courier-BoldOblique" size:30.0] range:NSMakeRange(19, 6)];
attrLabel.attributedText = str;
效果圖:
如果想在iOS6.0以前版本實(shí)現(xiàn)這個(gè)效果,需要使用到一個(gè)第三方庫TTTAttributedLabel,同時(shí)還有導(dǎo)入CoreText.frame框架.
二、運(yùn)用runtime全局修改UILabel的默認(rèn)字體
這是最簡(jiǎn)單方便的方法,我們可以使用runtime機(jī)制替換掉UILabel的初始化方法,在其中對(duì)label的字體進(jìn)行默認(rèn)設(shè)置。因?yàn)長(zhǎng)abel可以從initWithFrame、init和nib文件三個(gè)來源初始化,所以我們需要將這三個(gè)初始化的方法都替換掉。
首先,我們創(chuàng)建一個(gè)UILabel的類別:
#import <UIKit/UIKit.h>
@interface UILabel (YHBaseChangeDefaultFont)
@end
在其中加入如下代碼:
#import "UILabel+YHBaseChangeDefaultFont.h"
#import <objc/runtime.h>
@implementation UILabel (YHBaseChangeDefaultFont)
/**
*每個(gè)NSObject的子類都會(huì)調(diào)用下面這個(gè)方法 在這里將init方法進(jìn)行替換,使用我們的新字體
*如果在程序中又特殊設(shè)置了字體 則特殊設(shè)置的字體不會(huì)受影響 但是不要在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:@"這里輸入你的字體名字" size:self.font.pointSize];
if (font) {
self.font=font;
}
return __self;
}
-(instancetype)YHBaseInitWithFrame:(CGRect)rect{
id __self = [self YHBaseInitWithFrame:rect];
UIFont * font = [UIFont fontWithName:@"這里輸入你的字體名字" size:self.font.pointSize];
if (font) {
self.font=font;
}
return __self;
}
-(void)YHBaseAwakeFromNib{
[self YHBaseAwakeFromNib];
UIFont * font = [UIFont fontWithName:@"這里輸入你的字體名字" size:self.font.pointSize];
if (font) {
self.font=font;
}
}
@end
在上面的方法中寫入我們想要UILabel默認(rèn)顯示的字體,我們分別從init,initWithFrame和nib文件創(chuàng)建一個(gè)UILabel添加到視圖上,不做任何其他的操作:
UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(20, 100, 280, 30)];
label.text = @"你是從initWithFrame來的label";
UILabel * label2 = [[UILabel alloc]init];
label2.frame= CGRectMake(20, 200, 280, 30);
label2.text = @"你是從init來的label";
[self.view addSubview:label];
[self.view addSubview:label2];
運(yùn)行效果如下,可以看出,字體全部換掉了:
- iOS開發(fā)中使用UILabel設(shè)置字體的相關(guān)技巧小結(jié)
- iOS中UILabel設(shè)置居上對(duì)齊、居中對(duì)齊、居下對(duì)齊及文字置頂顯示
- iOS長(zhǎng)按UIlabel實(shí)現(xiàn)可復(fù)制功能
- iOS應(yīng)用中UILabel文字顯示效果的常用設(shè)置總結(jié)
- iOS 設(shè)置UILabel的行間距并自適應(yīng)高度的方法
- iOS UILabel 設(shè)置內(nèi)容的間距及高度的計(jì)算示例
- iOS開發(fā)筆記--詳解UILabel的相關(guān)屬性設(shè)置
- UILabel顯示定時(shí)器文本跳動(dòng)問題的解決方法
相關(guān)文章
iOS Crash常規(guī)跟蹤方法及Bugly集成運(yùn)用詳細(xì)介紹
這篇文章主要介紹了iOS Crash常規(guī)跟蹤方法及Bugly集成運(yùn)用詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-10-10iOS安全防護(hù)系列之重簽名防護(hù)與sysctl反調(diào)試詳解
這篇文章主要給大家介紹了關(guān)于iOS安全防護(hù)系列之重簽名防護(hù)與sysctl反調(diào)試的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對(duì)各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07iOS實(shí)現(xiàn)點(diǎn)擊狀態(tài)欄自動(dòng)回到頂部效果詳解
在IOS開發(fā)過程中,經(jīng)常會(huì)有這種需求,需要通過點(diǎn)擊狀態(tài)欄返回到頂部,給用戶更好的體驗(yàn)效果,下面這篇文章給大家詳細(xì)介紹了實(shí)現(xiàn)過程,有需要的可以參考借鑒。2016-09-09在IOS系統(tǒng)上滾動(dòng)條滾動(dòng)到指定的位置出現(xiàn)空白頁面的解決方案
這篇文章主要介紹了 在IOS系統(tǒng)上滾動(dòng)條滾動(dòng)到指定的位置出現(xiàn)空白頁面的解決方案,需要的朋友可以參考下2017-01-01iOS應(yīng)用進(jìn)入后臺(tái)后計(jì)時(shí)器和位置更新停止問題的解決辦法
這篇文章主要介紹了iOS應(yīng)用進(jìn)入后臺(tái)后計(jì)時(shí)器和位置更新停止問題的解決辦法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03