在iOS開(kāi)發(fā)中使用iconfont圖標(biāo)

在開(kāi)發(fā)iOS項(xiàng)目時(shí)醇疼,不可避免的會(huì)用到圖標(biāo)朴艰,而為了適配不同分辨率的設(shè)備,我們通常會(huì)需要@2x址愿,@3x兩套格式的圖片该镣,最明顯的就是底部tabBar的圖標(biāo)使用。而對(duì)于那些有換膚需求的APP來(lái)說(shuō)响谓,還需要多套圖來(lái)匹配不同的主題损合。通過(guò)切圖的方式制作圖標(biāo)省艳,一方面加大了開(kāi)發(fā)者和設(shè)計(jì)者的工作量,另一方面也會(huì)增大APP的體積嫁审。而使用iconfont的可以達(dá)到以下目的
1.減小應(yīng)用體積跋炕,字體文件比圖片要小律适;
2.圖標(biāo)保真縮放辐烂,解決2x/3x乃至將來(lái)nx圖問(wèn)題;
3.方便更改圖標(biāo)顏色大小捂贿,圖片復(fù)用棉圈。

所以為了給開(kāi)發(fā)者、設(shè)計(jì)者稍微減少點(diǎn)工作量眷蜓,給APP“減重分瘾,我們可以將iconfont應(yīng)用到自己的項(xiàng)目中。那么吁系,iconfont是怎么用的呢德召?iconfont,從字面上就能理解它就是字體汽纤,讓開(kāi)發(fā)者像使用字體一樣使用圖標(biāo)上岗。

由于我是做開(kāi)發(fā)的,所以對(duì)于iconfont的制作并不太熟悉蕴坪,都是設(shè)計(jì)師做好了圖標(biāo)給我肴掷,如果你想學(xué)習(xí)iconfont的制作的話,可以去阿里巴巴的iconfont平臺(tái)去看看背传,上面有比較全的資料呆瞻。制作好的iconfont圖標(biāo)是一種.ttf格式的字體,如圖:

iconfont圖標(biāo)

iconfont中的圖標(biāo)是這樣的:

iconfont中的圖標(biāo)

而我們需要的是將.ttf格式的文件引入到自己的工程中

接下來(lái)我們借助淘點(diǎn)點(diǎn)科技寫(xiě)的一個(gè)關(guān)于iconfont封裝径玖,方便我們使用iconfont痴脾。iconfont的封裝包括


iconfont

1.TBCityIconInfo.h的實(shí)現(xiàn)

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface TBCityIconInfo : NSObject

@property (nonatomic, strong) NSString *text;
@property (nonatomic, assign) NSInteger size;
@property (nonatomic, strong) UIColor *color;

- (instancetype)initWithText:(NSString *)text size:(NSInteger)size color:(UIColor *)color;
+ (instancetype)iconInfoWithText:(NSString *)text size:(NSInteger)size color:(UIColor *)color;

@end

2.TBCityFontImageInfo.m的實(shí)現(xiàn)

#import "TBCityIconInfo.h"

@implementation TBCityIconInfo

- (instancetype)initWithText:(NSString *)text size:(NSInteger)size color:(UIColor *)color {
    if (self = [super init]) {
        self.text = text;
        self.size = size;
        self.color = color;
    }
    return self;
}

+ (instancetype)iconInfoWithText:(NSString *)text size:(NSInteger)size color:(UIColor *)color {
    return [[TBCityIconInfo alloc] initWithText:text size:size color:color];
}

@end

3.TBCityIconFont.h的實(shí)現(xiàn)

#import "UIImage+TBCityIconFont.h"
#import "TBCityIconInfo.h"

#define TBCityIconInfoMake(text, imageSize, imageColor) [TBCityIconInfo iconInfoWithText:text size:imageSize color:imageColor]

@interface TBCityIconFont : NSObject

+ (UIFont *)fontWithSize: (CGFloat)size;
+ (void)setFontName:(NSString *)fontName;

@end

4.TBCityIconFont.m的實(shí)現(xiàn)

#import "TBCityIconFont.h"
#import <CoreText/CoreText.h>

@implementation TBCityIconFont

static NSString *_fontName;

+ (void)registerFontWithURL:(NSURL *)url {
    NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[url path]], @"Font file doesn't exist");
    CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url);
    CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider);
    CGDataProviderRelease(fontDataProvider);
    CTFontManagerRegisterGraphicsFont(newFont, nil);
    CGFontRelease(newFont);
}

+ (UIFont *)fontWithSize:(CGFloat)size {
    UIFont *font = [UIFont fontWithName:[self fontName] size:size];
    if (font == nil) {
        NSURL *fontFileUrl = [[NSBundle mainBundle] URLForResource:[self fontName] withExtension:@"ttf"];
        [self registerFontWithURL: fontFileUrl];
        font = [UIFont fontWithName:[self fontName] size:size];
        NSAssert(font, @"UIFont object should not be nil, check if the font file is added to the application bundle and you're using the correct font name.");
    }
    return font;
}

+ (void)setFontName:(NSString *)fontName {
    _fontName = fontName;
    
}

+ (NSString *)fontName {
    return _fontName ? : @"iconfont";
}

@end

5.UIImage+TBCityIconFont.h的實(shí)現(xiàn)

#import <UIKit/UIKit.h>
#import "TBCityIconInfo.h"

@interface UIImage (TBCityIconFont)

+ (UIImage *)iconWithInfo:(TBCityIconInfo *)info;

@end

6.UIImage+TBCityIconFont.m

#import "UIImage+TBCityIconFont.h"
#import "TBCityIconFont.h"
#import <CoreText/CoreText.h>

@implementation UIImage (TBCityIconFont)

+ (UIImage *)iconWithInfo:(TBCityIconInfo *)info {
    CGFloat size = info.size;
    CGFloat scale = [UIScreen mainScreen].scale;
    CGFloat realSize = size * scale;
    UIFont *font = [TBCityIconFont fontWithSize:realSize];
    UIGraphicsBeginImageContext(CGSizeMake(realSize, realSize));
    CGContextRef context = UIGraphicsGetCurrentContext();
 
    if ([info.text respondsToSelector:@selector(drawAtPoint:withAttributes:)]) {
        /**
         * 如果這里拋出異常,請(qǐng)打開(kāi)斷點(diǎn)列表梳星,右擊All Exceptions -> Edit Breakpoint -> All修改為Objective-C
         * See: http://stackoverflow.com/questions/1163981/how-to-add-a-breakpoint-to-objc-exception-throw/14767076#14767076
         */
        [info.text drawAtPoint:CGPointZero withAttributes:@{NSFontAttributeName:font, NSForegroundColorAttributeName: info.color}];
    } else {
        
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
        CGContextSetFillColorWithColor(context, info.color.CGColor);
        [info.text drawAtPoint:CGPointMake(0, 0) withFont:font];
#pragma clang pop
    }
    
    UIImage *image = [UIImage imageWithCGImage:UIGraphicsGetImageFromCurrentImageContext().CGImage scale:scale orientation:UIImageOrientationUp];
    UIGraphicsEndImageContext();
    
    return image;
}

@end

7.在AppDelegate.m中赞赖,初始化我們的iconfont

#import "AppDelegate.h"
#import "TBCityIconFont.h"
#import "ViewController.h"
@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   //iconfont圖標(biāo)
    [TBCityIconFont setFontName:@"iconfont"];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
    _window.rootViewController = nav;
    // Override point for customization after application launch.
    return YES;
}

8.在ViewController.m中實(shí)現(xiàn)

#import "ViewController.h"
#import "TBCityIconFont.h"
#import "UIImage+TBCityIconFont.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    self.navigationController.navigationBar.translucent = NO;
    
    UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc] initWithImage:[ UIImage iconWithInfo:TBCityIconInfoMake(@"\U0000e602",22,[UIColor colorWithRed:0.55 green:0.55 blue:0.55 alpha:1])] style:UIBarButtonItemStylePlain target:self action:@selector(leftButtonAction)];
    self.navigationItem.leftBarButtonItem = leftBarButton;
    
   
    self.navigationItem.leftBarButtonItem.tintColor = [UIColor colorWithRed:0.55 green:0.55 blue:0.55 alpha:1];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage iconWithInfo:TBCityIconInfoMake(@"\U0000e60d",25, [UIColor colorWithRed:0.14 green:0.61 blue:0.83 alpha:1.00])] style:UIBarButtonItemStylePlain target:self action:@selector(rightButtonAction)];
     self.navigationItem.rightBarButtonItem.tintColor = [UIColor colorWithRed:0.14 green:0.61 blue:0.83 alpha:1.00];
 
    // Do any additional setup after loading the view, typically from a nib.
}

-(void)loadView{
    [super loadView];
//    imageView
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 50, 30, 30)];
    [self.view addSubview:imageView];
//圖標(biāo)編碼是&#xe603,需要轉(zhuǎn)成\U0000e603
    imageView.image = [UIImage iconWithInfo:TBCityIconInfoMake(@"\U0000e603", 30, [UIColor redColor])];
//    button
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(100, 100, 40, 40);
    [self.view addSubview:button];
    [button setImage:[UIImage iconWithInfo:TBCityIconInfoMake(@"\U0000e60c", 40, [UIColor redColor])] forState:UIControlStateNormal];
//    label,label可以將文字與圖標(biāo)結(jié)合一起冤灾,直接用label的text屬性將圖標(biāo)顯示出來(lái)
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 160, 280, 40)];
    [self.view addSubview:label];
    label.font = [UIFont fontWithName:@"iconfont" size:15];//設(shè)置label的字體
    label.text = @"這是用label顯示的iconfont  \U0000e60c";
}
-(void)leftButtonAction{
    
}
-(void)rightButtonAction{
    
}

9.運(yùn)行得到的結(jié)果如圖:

iconfont圖標(biāo)示例

這樣前域,我們就可以很方便的使用iconfont圖標(biāo)了。這里要注意的是韵吨,圖標(biāo)是用的iconfont中的圖標(biāo)用的是unicode編碼匿垄,我們?cè)谧约旱墓こ讨袝r(shí)需要將&#xXXXX格式轉(zhuǎn)換成\UXXXXXXXX格式。

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市年堆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盏浇,老刑警劉巖变丧,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绢掰,居然都是意外死亡痒蓬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)滴劲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)攻晒,“玉大人,你說(shuō)我怎么就攤上這事班挖÷衬螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵萧芙,是天一觀的道長(zhǎng)给梅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)双揪,這世上最難降的妖魔是什么动羽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮渔期,結(jié)果婚禮上运吓,老公的妹妹穿的比我還像新娘。我一直安慰自己疯趟,他們只是感情好拘哨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著信峻,像睡著了一般宅静。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上站欺,一...
    開(kāi)封第一講書(shū)人閱讀 48,954評(píng)論 1 283
  • 那天姨夹,我揣著相機(jī)與錄音,去河邊找鬼矾策。 笑死磷账,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贾虽。 我是一名探鬼主播逃糟,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绰咽?” 一聲冷哼從身側(cè)響起菇肃,我...
    開(kāi)封第一講書(shū)人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎取募,沒(méi)想到半個(gè)月后琐谤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玩敏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年斗忌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旺聚。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡织阳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砰粹,到底是詐尸還是另有隱情唧躲,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布碱璃,位于F島的核電站惊窖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏厘贼。R本人自食惡果不足惜界酒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘴秸。 院中可真熱鬧毁欣,春花似錦、人聲如沸岳掐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)串述。三九已至执解,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纲酗,已是汗流浹背衰腌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留觅赊,地道東北人右蕊。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吮螺,于是被迫代替她去往敵國(guó)和親饶囚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帕翻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在開(kāi)發(fā)項(xiàng)目時(shí)嘀掸,為了適配不同分辨率的設(shè)備,我們通常會(huì)需要@2x规惰,@3x兩套格式的圖片睬塌,最明顯的就是底部tabBar的...
    宇玄丶閱讀 1,808評(píng)論 0 1
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,497評(píng)論 25 707
  • 什么是Iconfont 我們通常看到的圖標(biāo)都是以圖片形式集成到項(xiàng)目中使用卿拴,而 Iconfont 是一套字體圖標(biāo),和...
    十秒_閱讀 3,334評(píng)論 1 14
  • 姐姐叮囑我記得問(wèn)前臺(tái)要停車券梨与,今天限號(hào)9點(diǎn)后才能走堕花,我已經(jīng)忘了我是開(kāi)車來(lái)的,還限號(hào)粥鞋!我說(shuō)好缘挽,要記得。姐姐的朋友接她...
    君君之閱讀 235評(píng)論 0 0
  • 二月春風(fēng)呻粹; 三月?lián)崃?四月雨滴濕潤(rùn)了空氣壕曼; 你從遠(yuǎn)方走來(lái), 留下一粒微塵等浊; 你的消失腮郊,讓五月的花六月便枯竭; 讓...
    在線顯示i閱讀 532評(píng)論 2 2