作者:JackerooChu來源:https://www.jianshu.com/p/0e899abe6bbc


1.什麼是iconfont

iconFont拆開來看,就是 Icon + Font,這樣估計大家應該都能理解是什麼,那兩者結合是什麼呢?沒錯!就是 IconFont !讓開發者像使用字體一樣使用圖標。如果自己不會做的話,可以直接去阿里的iconfont圖標庫下載自己需要的圖標。

2.爲什麼要使用iconfont

在開發項目時,不可避免的會用到各種圖標,爲了適配不同的設備,通常需要@2x和@3x兩套圖,例如說我們tabBar上使用的圖標。有些app有換膚的需要,還需要多套不同的圖來進行匹配不同的主題。如果使用切圖,這對於設計和開發來說無疑是增加了工作量,而且ipa的體積也會增大。

使用iconfont的好處:

  1. 減小ipa包的大小
  2. 圖標保真縮放,多設備適配一套圖解決問題
  3. 適應換膚要求,使用方便。


3.怎麼用iconfont

1. 首先去iconfont圖標庫下載自己需要的圖標。


iOS上如何使用iconfont圖標



如圖我們可以選擇自己需要的icon加入到購物車,然後加入項目裏,當然你也可以直接在購物車直接下載,但是這樣只是沒有修改icon爲自己想要的樣式,加入項目中,你可以自己任意修改icon爲自己想要的樣式。


iOS上如何使用iconfont圖標



注意:這裏是下載代碼,這樣我們就可以在項目中直接使用

2.將下載下來的icon資源添加到自己的項目中。


iOS上如何使用iconfont圖標



我們所需要的就是這個iconfont.ttf,對於這個ttf文件,我想我們並不陌生吧。新建項目,將這個ttf文件拖入自己的項目裏。


iOS上如何使用iconfont圖標


注意:勾選如圖選項

接下來配置項目加載這個文件

  • 檢查文件是否在項目中,不然會崩潰


iOS上如何使用iconfont圖標



  • 在plist文件中加入字體


iOS上如何使用iconfont圖標



接下來我們藉助淘點點科技寫的一個關於iconfont封裝,方便我們使用iconfont。iconfont的封裝包括


iOS上如何使用iconfont圖標



1.TBCityIconInfo.h的實現

#import 
#import
@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.TBCityIconInfo.m的實現

#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的實現

#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;


4.TBCityIconFont.m的實現

#import "TBCityIconFont.h"
#import
@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的實現

#import 
#import "TBCityIconInfo.h"
@interface UIImage (TBCityIconFont)
+ (UIImage *)iconWithInfo:(TBCityIconInfo *)info;
@end


6.UIImage+TBCityIconFont.m的實現

#import "UIImage+TBCityIconFont.h"
#import "TBCityIconFont.h"
#import
@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:)]) {
/**
* 如果這裏拋出異常,請打開斷點列表,右擊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


3.具體使用方法

1.在AppDelegate.m中,初始化iconfont

#import "AppDelegate.h"
#import "TBCityIconFont.h"
#import "ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[TBCityIconFont setFontName:@"iconfont"];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
}


2.在ViewController.m中實現

#import "ViewController.h"
#import "TBCityIconFont.h"
#import "UIImage+TBCityIconFont.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 30, 30)];
[self.view addSubview:imageView];
//圖標編碼是,需要轉成U0000e600
imageView.image = [UIImage iconWithInfo:TBCityIconInfoMake(@"U0000e600", 30, [UIColor redColor])];
// button
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.frame = CGRectMake(100, 150, 40, 40);
[self.view addSubview:button];
[button setImage:[UIImage iconWithInfo:TBCityIconInfoMake(@"U0000e614", 40, [UIColor redColor])] forState:UIControlStateNormal];
// label,label可以將文字與圖標結合一起,直接用label的text屬性將圖標顯示出來
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 280, 40)];
[self.view addSubview:label];
label.font = [UIFont fontWithName:@"iconfont" size:15];//設置label的字體
label.text = @"在lable上顯示 U0000e658";
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end


結果如下圖所示:


iOS上如何使用iconfont圖標



注意:

1. 所用到的unicode編碼需要自己手動將XXXX格式轉換成UXXXXXXXX格式,例如//圖標編碼是,需要轉成U0000e600

2. 所有需要的unicode編碼都可以在下載的iconfont文件夾中的.html文件打開查看


iOS上如何使用iconfont圖標



本文demo,歡迎批評指正,留下你的star哦。

相關文章