├── .gitignore
├── README.md
├── WBTextKitTools.xcodeproj
├── project.pbxproj
└── project.xcworkspace
│ └── contents.xcworkspacedata
├── WBTextKitTools
├── AppDelegate.h
├── AppDelegate.m
├── Base.lproj
│ └── LaunchScreen.xib
├── FaceView
│ ├── WBFaceView.h
│ ├── WBFaceView.m
│ └── WBFaceView.xib
├── Images.xcassets
│ ├── AppIcon.appiconset
│ │ └── Contents.json
│ └── LaunchImage.launchimage
│ │ └── Contents.json
├── Info.plist
├── Resource
│ ├── Face
│ │ ├── GIF
│ │ │ ├── 001@2x.gif
│ │ │ ├── 002@2x.gif
│ │ │ ├── 003@2x.gif
│ │ │ ├── 004@2x.gif
│ │ │ ├── 005@2x.gif
│ │ │ ├── 006@2x.gif
│ │ │ ├── 007@2x.gif
│ │ │ ├── 008@2x.gif
│ │ │ ├── 009@2x.gif
│ │ │ ├── 010@2x.gif
│ │ │ ├── 011@2x.gif
│ │ │ ├── 012@2x.gif
│ │ │ ├── 013@2x.gif
│ │ │ ├── 014@2x.gif
│ │ │ ├── 015@2x.gif
│ │ │ ├── 016@2x.gif
│ │ │ ├── 017@2x.gif
│ │ │ ├── 018@2x.gif
│ │ │ ├── 019@2x.gif
│ │ │ ├── 020@2x.gif
│ │ │ ├── 021@2x.gif
│ │ │ ├── 022@2x.gif
│ │ │ ├── 023@2x.gif
│ │ │ ├── 024@2x.gif
│ │ │ ├── 025@2x.gif
│ │ │ ├── 026@2x.gif
│ │ │ ├── 027@2x.gif
│ │ │ ├── 028@2x.gif
│ │ │ ├── 029@2x.gif
│ │ │ ├── 030@2x.gif
│ │ │ ├── 031@2x.gif
│ │ │ ├── 032@2x.gif
│ │ │ ├── 033@2x.gif
│ │ │ ├── 034@2x.gif
│ │ │ ├── 035@2x.gif
│ │ │ ├── 036@2x.gif
│ │ │ ├── 037@2x.gif
│ │ │ ├── 038@2x.gif
│ │ │ ├── 039@2x.gif
│ │ │ ├── 040@2x.gif
│ │ │ ├── 041@2x.gif
│ │ │ ├── 042@2x.gif
│ │ │ ├── 043@2x.gif
│ │ │ ├── 044@2x.gif
│ │ │ ├── 045@2x.gif
│ │ │ ├── 046@2x.gif
│ │ │ ├── 047@2x.gif
│ │ │ ├── 048@2x.gif
│ │ │ ├── 049@2x.gif
│ │ │ ├── 050@2x.gif
│ │ │ ├── 051@2x.gif
│ │ │ ├── 052@2x.gif
│ │ │ ├── 053@2x.gif
│ │ │ ├── 054@2x.gif
│ │ │ ├── 055@2x.gif
│ │ │ ├── 056@2x.gif
│ │ │ ├── 057@2x.gif
│ │ │ ├── 058@2x.gif
│ │ │ ├── 059@2x.gif
│ │ │ ├── 060@2x.gif
│ │ │ ├── 061@2x.gif
│ │ │ ├── 062@2x.gif
│ │ │ ├── 063@2x.gif
│ │ │ ├── 064@2x.gif
│ │ │ ├── 065@2x.gif
│ │ │ ├── 066@2x.gif
│ │ │ ├── 067@2x.gif
│ │ │ ├── 068@2x.gif
│ │ │ ├── 069@2x.gif
│ │ │ ├── 070@2x.gif
│ │ │ ├── 071@2x.gif
│ │ │ ├── 072@2x.gif
│ │ │ ├── 073@2x.gif
│ │ │ ├── 074@2x.gif
│ │ │ ├── 075@2x.gif
│ │ │ ├── 076@2x.gif
│ │ │ ├── 077@2x.gif
│ │ │ ├── 078@2x.gif
│ │ │ ├── 079@2x.gif
│ │ │ ├── 080@2x.gif
│ │ │ ├── 081@2x.gif
│ │ │ ├── 082@2x.gif
│ │ │ ├── 083@2x.gif
│ │ │ ├── 084@2x.gif
│ │ │ ├── 085@2x.gif
│ │ │ ├── 086@2x.gif
│ │ │ ├── 087@2x.gif
│ │ │ ├── 088@2x.gif
│ │ │ ├── 089@2x.gif
│ │ │ ├── 090@2x.gif
│ │ │ ├── 091@2x.gif
│ │ │ ├── 092@2x.gif
│ │ │ ├── 093@2x.gif
│ │ │ ├── 094@2x.gif
│ │ │ ├── 095@2x.gif
│ │ │ ├── 096@2x.gif
│ │ │ ├── 097@2x.gif
│ │ │ ├── 098@2x.gif
│ │ │ ├── 099@2x.gif
│ │ │ ├── 100@2x.gif
│ │ │ ├── 101@2x.gif
│ │ │ ├── 102@2x.gif
│ │ │ ├── 103@2x.gif
│ │ │ ├── 104@2x.gif
│ │ │ ├── 105@2x.gif
│ │ │ ├── 106@2x.gif
│ │ │ ├── 107@2x.gif
│ │ │ ├── 108@2x.gif
│ │ │ ├── 109@2x.gif
│ │ │ ├── 110@2x.gif
│ │ │ ├── 111@2x.gif
│ │ │ ├── 112@2x.gif
│ │ │ ├── 113@2x.gif
│ │ │ ├── 114@2x.gif
│ │ │ ├── 115@2x.gif
│ │ │ ├── 116@2x.gif
│ │ │ ├── 117@2x.gif
│ │ │ ├── 118@2x.gif
│ │ │ ├── 119@2x.gif
│ │ │ ├── 120@2x.gif
│ │ │ ├── 121@2x.gif
│ │ │ ├── 122@2x.gif
│ │ │ ├── 123@2x.gif
│ │ │ ├── 124@2x.gif
│ │ │ ├── 125@2x.gif
│ │ │ ├── 126@2x.gif
│ │ │ ├── 127@2x.gif
│ │ │ ├── 128@2x.gif
│ │ │ ├── 129@2x.gif
│ │ │ ├── 130@2x.gif
│ │ │ ├── 131@2x.gif
│ │ │ ├── 132@2x.gif
│ │ │ ├── 133@2x.gif
│ │ │ ├── 134@2x.gif
│ │ │ ├── 135@2x.gif
│ │ │ ├── 136@2x.gif
│ │ │ ├── 137@2x.gif
│ │ │ ├── 138@2x.gif
│ │ │ ├── 139@2x.gif
│ │ │ ├── 140@2x.gif
│ │ │ └── 141@2x.gif
│ │ ├── PNG
│ │ │ ├── 001@2x.png
│ │ │ ├── 002@2x.png
│ │ │ ├── 003@2x.png
│ │ │ ├── 004@2x.png
│ │ │ ├── 005@2x.png
│ │ │ ├── 006@2x.png
│ │ │ ├── 007@2x.png
│ │ │ ├── 008@2x.png
│ │ │ ├── 009@2x.png
│ │ │ ├── 010@2x.png
│ │ │ ├── 011@2x.png
│ │ │ ├── 012@2x.png
│ │ │ ├── 013@2x.png
│ │ │ ├── 014@2x.png
│ │ │ ├── 015@2x.png
│ │ │ ├── 016@2x.png
│ │ │ ├── 017@2x.png
│ │ │ ├── 018@2x.png
│ │ │ ├── 019@2x.png
│ │ │ ├── 020@2x.png
│ │ │ ├── 021@2x.png
│ │ │ ├── 022@2x.png
│ │ │ ├── 023@2x.png
│ │ │ ├── 024@2x.png
│ │ │ ├── 025@2x.png
│ │ │ ├── 026@2x.png
│ │ │ ├── 027@2x.png
│ │ │ ├── 028@2x.png
│ │ │ ├── 029@2x.png
│ │ │ ├── 030@2x.png
│ │ │ ├── 031@2x.png
│ │ │ ├── 032@2x.png
│ │ │ ├── 033@2x.png
│ │ │ ├── 034@2x.png
│ │ │ ├── 035@2x.png
│ │ │ ├── 036@2x.png
│ │ │ ├── 037@2x.png
│ │ │ ├── 038@2x.png
│ │ │ ├── 039@2x.png
│ │ │ ├── 040@2x.png
│ │ │ ├── 041@2x.png
│ │ │ ├── 042@2x.png
│ │ │ ├── 043@2x.png
│ │ │ ├── 044@2x.png
│ │ │ ├── 045@2x.png
│ │ │ ├── 046@2x.png
│ │ │ ├── 047@2x.png
│ │ │ ├── 048@2x.png
│ │ │ ├── 049@2x.png
│ │ │ ├── 050@2x.png
│ │ │ ├── 051@2x.png
│ │ │ ├── 052@2x.png
│ │ │ ├── 053@2x.png
│ │ │ ├── 054@2x.png
│ │ │ ├── 055@2x.png
│ │ │ ├── 056@2x.png
│ │ │ ├── 057@2x.png
│ │ │ ├── 058@2x.png
│ │ │ ├── 059@2x.png
│ │ │ ├── 060@2x.png
│ │ │ ├── 061@2x.png
│ │ │ ├── 062@2x.png
│ │ │ ├── 063@2x.png
│ │ │ ├── 064@2x.png
│ │ │ ├── 065@2x.png
│ │ │ ├── 066@2x.png
│ │ │ ├── 067@2x.png
│ │ │ ├── 068@2x.png
│ │ │ ├── 069@2x.png
│ │ │ ├── 070@2x.png
│ │ │ ├── 071@2x.png
│ │ │ ├── 072@2x.png
│ │ │ ├── 073@2x.png
│ │ │ ├── 074@2x.png
│ │ │ ├── 075@2x.png
│ │ │ ├── 076@2x.png
│ │ │ ├── 077@2x.png
│ │ │ ├── 078@2x.png
│ │ │ ├── 079@2x.png
│ │ │ ├── 080@2x.png
│ │ │ ├── 081@2x.png
│ │ │ ├── 082@2x.png
│ │ │ ├── 083@2x.png
│ │ │ ├── 084@2x.png
│ │ │ ├── 085@2x.png
│ │ │ ├── 086@2x.png
│ │ │ ├── 087@2x.png
│ │ │ ├── 088@2x.png
│ │ │ ├── 089@2x.png
│ │ │ ├── 090@2x.png
│ │ │ ├── 091@2x.png
│ │ │ ├── 092@2x.png
│ │ │ ├── 093@2x.png
│ │ │ ├── 094@2x.png
│ │ │ ├── 095@2x.png
│ │ │ ├── 096@2x.png
│ │ │ ├── 097@2x.png
│ │ │ ├── 098@2x.png
│ │ │ ├── 099@2x.png
│ │ │ ├── 100@2x.png
│ │ │ ├── 101@2x.png
│ │ │ ├── 102@2x.png
│ │ │ ├── 103@2x.png
│ │ │ ├── 104@2x.png
│ │ │ ├── 105@2x.png
│ │ │ ├── 106@2x.png
│ │ │ ├── 107@2x.png
│ │ │ ├── 108@2x.png
│ │ │ ├── 109@2x.png
│ │ │ ├── 110@2x.png
│ │ │ ├── 111@2x.png
│ │ │ ├── 112@2x.png
│ │ │ ├── 113@2x.png
│ │ │ ├── 114@2x.png
│ │ │ ├── 115@2x.png
│ │ │ ├── 116@2x.png
│ │ │ ├── 117@2x.png
│ │ │ ├── 118@2x.png
│ │ │ ├── 119@2x.png
│ │ │ ├── 120@2x.png
│ │ │ ├── 121@2x.png
│ │ │ ├── 122@2x.png
│ │ │ ├── 123@2x.png
│ │ │ ├── 124@2x.png
│ │ │ ├── 125@2x.png
│ │ │ ├── 126@2x.png
│ │ │ ├── 127@2x.png
│ │ │ ├── 128@2x.png
│ │ │ ├── 129@2x.png
│ │ │ ├── 130@2x.png
│ │ │ ├── 131@2x.png
│ │ │ ├── 132@2x.png
│ │ │ ├── 133@2x.png
│ │ │ ├── 134@2x.png
│ │ │ ├── 135@2x.png
│ │ │ ├── 136@2x.png
│ │ │ ├── 137@2x.png
│ │ │ ├── 138@2x.png
│ │ │ ├── 139@2x.png
│ │ │ ├── 140@2x.png
│ │ │ └── 141@2x.png
│ │ ├── emotionGifImage.plist
│ │ └── emotionPngImage.plist
│ └── Image
│ │ ├── face_delete@2x.png
│ │ ├── face_delete_pressed@2x.png
│ │ ├── qvip_emoji_tab_classic@2x.png
│ │ ├── qvip_emoji_tab_classic_pressed@2x.png
│ │ ├── qvip_emoji_tab_history@2x.png
│ │ ├── qvip_emoji_tab_history_pressed@2x.png
│ │ ├── transparent.png
│ │ └── transparent@2x.png
├── ThirdPartyTools
│ └── YLGIFImage
│ │ ├── YLGIFImage.h
│ │ ├── YLGIFImage.m
│ │ ├── YLImageView.h
│ │ └── YLImageView.m
├── ViewController.h
├── ViewController.m
├── WBTextView
│ ├── WBTextAttachment.h
│ ├── WBTextAttachment.m
│ ├── WBTextStorage.h
│ ├── WBTextStorage.m
│ ├── WBTextView.h
│ └── WBTextView.m
└── main.m
└── WBTextKitToolsTests
├── Info.plist
└── WBTextKitToolsTests.m
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | build/
4 | *.pbxuser
5 | !default.pbxuser
6 | *.mode1v3
7 | !default.mode1v3
8 | *.mode2v3
9 | !default.mode2v3
10 | *.perspectivev3
11 | !default.perspectivev3
12 | xcuserdata
13 | *.xccheckout
14 | *.moved-aside
15 | DerivedData
16 | *.hmap
17 | *.ipa
18 | *.xcuserstate
19 |
20 | # CocoaPods
21 | #
22 | # We recommend against adding the Pods directory to your .gitignore. However
23 | # you should judge for yourself, the pros and cons are mentioned at:
24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
25 | #
26 | # Pods/
27 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | WBTextKitTools
2 | ==============
3 | ### 简介:
4 | 一个基于TextKit的自定义UITextView控件,支持自定义静态和GIF动态表情,支持选择复制粘贴表情,支持输入时直接显示表情。
5 |
6 | ### 使用:
7 | 请下载后,参照例子使用。
8 |
9 | ### 注意:
10 | 1、IOS7以上才能使用;
11 | 2、GIF的显示是使用的YLGIFImage,请git自行查找;
12 | 3、在开发的过程中借鉴过一些微博的文章以及STTweetLabel、CoreTextDemo_iOS7-master。
13 |
14 | ### 已发现的问题:
15 | 1、GIF表情显示存在效率问题,多个GIF表情的情况下,会出现卡顿;
16 | 2、URL的识别依然存在缺陷,正则表达式是在STTweetLabel截取的;
17 | 3、附本表情,删除时内存并没有释放?(不知道是否是没有及时释放)
18 | 4、表情选择器存在IPHONE6的适配问题。
19 |
--------------------------------------------------------------------------------
/WBTextKitTools.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/WBTextKitTools/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/11/20.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : UIResponder
12 |
13 | @property (strong, nonatomic) UIWindow *window;
14 |
15 |
16 | @end
17 |
18 |
--------------------------------------------------------------------------------
/WBTextKitTools/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/11/20.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 | #import "ViewController.h"
11 |
12 | @interface AppDelegate ()
13 |
14 | @end
15 |
16 | @implementation AppDelegate
17 |
18 |
19 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
20 | // Override point for customization after application launch.
21 | _window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
22 |
23 | ViewController *view = [[ViewController alloc]init];
24 | UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:view];
25 | nav.navigationBar.translucent = NO;
26 | self.window.rootViewController = nav;
27 | [_window makeKeyAndVisible];
28 | return YES;
29 | }
30 |
31 | - (void)applicationWillResignActive:(UIApplication *)application {
32 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
33 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
34 | }
35 |
36 | - (void)applicationDidEnterBackground:(UIApplication *)application {
37 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
38 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
39 | }
40 |
41 | - (void)applicationWillEnterForeground:(UIApplication *)application {
42 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
43 | }
44 |
45 | - (void)applicationDidBecomeActive:(UIApplication *)application {
46 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
47 | }
48 |
49 | - (void)applicationWillTerminate:(UIApplication *)application {
50 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
51 | }
52 |
53 | @end
54 |
--------------------------------------------------------------------------------
/WBTextKitTools/Base.lproj/LaunchScreen.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
20 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/WBTextKitTools/FaceView/WBFaceView.h:
--------------------------------------------------------------------------------
1 | //
2 | // WBFaceView.h
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/12/11.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @protocol WBFaceDelegate
12 | @optional
13 | - (void)insertFaceWithKey:(NSString *)faceKey;
14 | - (void)deleteFace;
15 | @end
16 |
17 |
18 | @interface WBFaceView : UIView
19 |
20 | @property (weak, nonatomic) IBOutlet UIScrollView *faceScroll;
21 | @property (weak, nonatomic) IBOutlet UIPageControl *pageController;
22 | @property (weak, nonatomic) IBOutlet UIButton *historyButton;
23 | @property (weak, nonatomic) IBOutlet UIButton *classicButton;
24 | @property (weak, nonatomic) id faceDelegate;
25 |
26 | - (IBAction)historyButtonClick:(UIButton *)sender;
27 | - (IBAction)classicButtonClick:(UIButton *)sender;
28 |
29 | @end
30 |
--------------------------------------------------------------------------------
/WBTextKitTools/FaceView/WBFaceView.m:
--------------------------------------------------------------------------------
1 | //
2 | // WBFaceView.m
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/12/11.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import "WBFaceView.h"
10 | #define RGBColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
11 | #define HistoryFace @"historyFace"
12 | #define HistoryFaces [[NSUserDefaults standardUserDefaults]objectForKey:HistoryFace]
13 | #define FaceLeftSign @"["
14 | #define FaceRightSign @"]"
15 |
16 | #define RowMaxFaceCount 7
17 | #define PageMaxFaceConut 20
18 | #define Item 15.5
19 | #define FaceWidth 28.0
20 | #define FaceHeight 28.0
21 |
22 | @implementation WBFaceView{
23 | NSMutableArray *_faces;
24 | NSMutableDictionary *_faceDictionary;
25 | NSInteger _numberOfPages;
26 | }
27 |
28 | #pragma mark -----------------------------------初始化
29 | - (id)initWithFrame:(CGRect)frame
30 | {
31 | self = [super initWithFrame:frame];
32 | if (self) {
33 | // 初始化加载xib文件
34 | NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"WBFaceView" owner:self options:nil];
35 |
36 | // 如果路径不存在,return nil
37 | if (arrayOfViews.count < 1)
38 | {
39 | return nil;
40 | }
41 | // 加载nib
42 | CGRect myRect = CGRectZero;
43 | myRect.origin = self.frame.origin;
44 | self = [arrayOfViews objectAtIndex:0];
45 | myRect.size = self.frame.size;
46 | self.frame = myRect;
47 |
48 | [self initScorll];
49 | [self initTabBar];
50 | [self setPageController];
51 | }
52 |
53 | return self;
54 | }
55 |
56 | #pragma mark -----------------------------------初始化Scorll
57 | - (void)initScorll
58 | {
59 | //表情集合
60 | NSString *emojiFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"emotionGifImage.plist"];
61 | _faceDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:emojiFilePath];
62 | _faces = [[NSMutableArray alloc]init];
63 |
64 | //不设置为NO的话,会导致BUTTON延迟高亮
65 | _faceScroll.delaysContentTouches = NO;
66 | _faceScroll.delegate = self;
67 | }
68 |
69 | #pragma mark -----------------------------------初始化TabBar
70 | - (void)initTabBar
71 | {
72 | [self historyButtonClick:_historyButton];
73 | }
74 |
75 | #pragma mark -----------------------------------设置页数
76 | - (void)setnumberOfPages
77 | {
78 | NSInteger faceCount = _faces.count;
79 | _numberOfPages = faceCount / PageMaxFaceConut;
80 | if (faceCount % PageMaxFaceConut != 0) {
81 | _numberOfPages++;
82 | }
83 | //计算ScroollView需要的大小
84 | _faceScroll.contentSize = CGSizeMake(self.frame.size.width * _numberOfPages, _faceScroll.bounds.size.height);
85 | }
86 |
87 | #pragma mark -----------------------------------设置PageController
88 | - (void)setPageController
89 | {
90 | [self setnumberOfPages];
91 | _pageController.numberOfPages = _numberOfPages; //设置页数
92 | _pageController.currentPage = 0; //初始页码为 0
93 | }
94 |
95 | #pragma mark -----------------------------------重载FaceScroll
96 | - (void)resetFaceScroll
97 | {
98 | //清空原有的视图
99 | for (UIView *view in _faceScroll.subviews) {
100 | if ([view isKindOfClass:[UIImageView class]] || [view isKindOfClass:[UIButton class]]) {
101 | [view removeFromSuperview];
102 | }
103 | }
104 |
105 | [self setPageController];
106 | [self loadFace];
107 | }
108 |
109 | #pragma mark -----------------------------------加载表情
110 | - (void)loadFace
111 | {
112 | int row = 1;//行
113 | int column = 1;//列
114 | int page = 0;//页
115 | int i = 1;//循环临时变量
116 | int count = 0;//当前循环的次数
117 |
118 | if (_classicButton.selected) {
119 | [self sortedFaceArray];
120 | }
121 |
122 | for (NSString *faceKey in _faces) {
123 | NSString *faceValue = [_faceDictionary objectForKey:faceKey];
124 | UIImageView *faceImageView = [[UIImageView alloc]initWithFrame:CGRectMake(self.frame.size.width * page + FaceWidth * (column - 1) + Item * column, FaceHeight * (row - 1) + Item * row, FaceWidth, FaceHeight)];
125 | faceImageView.userInteractionEnabled = YES;
126 | faceImageView.accessibilityIdentifier = faceKey;
127 | faceImageView.image = [UIImage imageNamed:faceValue];
128 | [_faceScroll addSubview:faceImageView];
129 |
130 | UITapGestureRecognizer *singeTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(insertFace:)];
131 | singeTap.numberOfTapsRequired = 1;
132 | [faceImageView addGestureRecognizer:singeTap];
133 |
134 | //计算行列
135 | if (column % RowMaxFaceCount == 0) {
136 | row++;
137 | column = 1;
138 | }else{
139 | column++;
140 | }
141 |
142 | if (page == _numberOfPages - 1 && count == _faces.count - 1 && i % PageMaxFaceConut != 0) {
143 | UIButton *delbutton = [UIButton buttonWithType:UIButtonTypeCustom];
144 | [delbutton addTarget:self action:@selector(deleteFace:) forControlEvents:UIControlEventTouchUpInside];
145 | [delbutton setImage:[UIImage imageNamed:@"face_delete"] forState:UIControlStateNormal];
146 | [delbutton setImage:[UIImage imageNamed:@"face_delete_pressed"] forState:UIControlStateHighlighted];
147 |
148 | if (column == 1) {
149 | delbutton.frame = CGRectMake(self.frame.size.width * page + FaceWidth * (column - 1) + Item * column, FaceHeight * (row - 1) + Item * row, FaceWidth, FaceHeight);
150 | }else{
151 | delbutton.frame = CGRectMake(faceImageView.frame.origin.x + FaceWidth + Item, faceImageView.frame.origin.y, FaceWidth, FaceHeight);
152 | }
153 | [_faceScroll addSubview:delbutton];
154 | }else if (i % PageMaxFaceConut == 0){
155 | //计算页
156 | UIButton *delbutton = [UIButton buttonWithType:UIButtonTypeCustom];
157 | [delbutton addTarget:self action:@selector(deleteFace:) forControlEvents:UIControlEventTouchUpInside];
158 | [delbutton setImage:[UIImage imageNamed:@"face_delete"] forState:UIControlStateNormal];
159 | [delbutton setImage:[UIImage imageNamed:@"face_delete_pressed"] forState:UIControlStateHighlighted];
160 | delbutton.frame = CGRectMake(faceImageView.frame.origin.x + FaceWidth + Item, faceImageView.frame.origin.y, FaceWidth, FaceHeight);
161 | [_faceScroll addSubview:delbutton];
162 |
163 | row = 1;
164 | column = 1;
165 | i = 1;
166 | page++;
167 | }else{
168 | i++;
169 | }
170 | count++;
171 | }
172 | }
173 |
174 | #pragma mark -----------------------------------点击表情
175 | - (void)insertFace:(UIGestureRecognizer *)gesture
176 | {
177 | UIImageView *myFaceView = (UIImageView *)gesture.view;
178 | NSString *faceKey = myFaceView.accessibilityIdentifier;
179 | if ([_faceDelegate respondsToSelector:@selector(insertFaceWithKey:)] && ![faceKey isEqual:@""] && faceKey != nil) {
180 | [_faceDelegate insertFaceWithKey:faceKey];
181 | [self insertFaceInHistoryFace:faceKey];
182 | }
183 | }
184 |
185 | #pragma mark -----------------------------------添加历史表情
186 | - (void)insertFaceInHistoryFace:(NSString *)faceKey
187 | {
188 | if (_historyButton.selected) {
189 | return;
190 | }
191 |
192 | NSMutableArray *historys = [[NSMutableArray alloc]initWithArray:HistoryFaces];
193 | for (NSString *historyFaceKey in historys) {
194 | if ([historyFaceKey isEqualToString:faceKey]) {
195 | [historys removeObject:faceKey];
196 | break;
197 | }
198 | }
199 |
200 | [historys insertObject:faceKey atIndex:0];
201 | [[NSUserDefaults standardUserDefaults]setObject:historys forKey:HistoryFace];
202 | [[NSUserDefaults standardUserDefaults]synchronize];
203 | }
204 |
205 | #pragma mark -----------------------------------滑动响应
206 | - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
207 | {
208 | if(scrollView == _faceScroll){
209 | CGPoint offset = scrollView.contentOffset;
210 | _pageController.currentPage = offset.x / (self.bounds.size.width); //计算当前的页码
211 | [_faceScroll setContentOffset:CGPointMake(self.bounds.size.width * (_pageController.currentPage),_faceScroll.contentOffset.y) animated:YES]; //设置scrollview的显示为当前滑动到的页面
212 | }
213 | }
214 |
215 | #pragma mark -----------------------------------点击历史表情
216 | - (IBAction)historyButtonClick:(UIButton *)sender
217 | {
218 | _historyButton.selected = YES;
219 | _historyButton.backgroundColor = RGBColor(212, 230, 246);
220 |
221 | _classicButton.selected = NO;
222 | _classicButton.backgroundColor = [UIColor whiteColor];
223 |
224 | [_faces removeAllObjects];
225 | [_faces addObjectsFromArray:HistoryFaces];
226 | [self resetFaceScroll];
227 | }
228 |
229 | #pragma mark -----------------------------------点击经典表情
230 | - (IBAction)classicButtonClick:(UIButton *)sender
231 | {
232 | _classicButton.selected = YES;
233 | _classicButton.backgroundColor = RGBColor(212, 230, 246);
234 |
235 | _historyButton.selected = NO;
236 | _historyButton.backgroundColor = [UIColor whiteColor];
237 |
238 | [_faces removeAllObjects];
239 | [_faces addObjectsFromArray:_faceDictionary.allKeys];
240 | [self resetFaceScroll];
241 | }
242 |
243 | #pragma mark -----------------------------------删除表情
244 | - (void)deleteFace:(UIButton *)sender
245 | {
246 | if ([_faceDelegate respondsToSelector:@selector(deleteFace)]) {
247 | [_faceDelegate deleteFace];
248 | }
249 | }
250 |
251 | #pragma mark -----------------------------------表情数组排序
252 | - (void)sortedFaceArray
253 | {
254 | NSComparator cmptr = ^(NSString *obj1, NSString *obj2){
255 | obj1 = [self numberFaceKey:obj1];
256 | obj2 = [self numberFaceKey:obj2];
257 |
258 | if ([obj1 integerValue] > [obj2 integerValue]) {
259 | return (NSComparisonResult)NSOrderedDescending;
260 | }
261 |
262 | if ([obj1 integerValue] < [obj2 integerValue]) {
263 | return (NSComparisonResult)NSOrderedAscending;
264 | }
265 | return (NSComparisonResult)NSOrderedSame;
266 | };
267 | NSArray *sortedArray = [_faces sortedArrayUsingComparator:cmptr];
268 | [_faces removeAllObjects];
269 | [_faces addObjectsFromArray:sortedArray];
270 | }
271 |
272 | #pragma mark -----------------------------------去掉表情KEY的左右特殊符号
273 | - (NSString *)numberFaceKey:(NSString *)faceKey
274 | {
275 | NSRange obj1LeftSignRange = [faceKey rangeOfString:FaceLeftSign];
276 | if (obj1LeftSignRange.location != NSNotFound) {
277 | faceKey = [faceKey substringFromIndex:obj1LeftSignRange.location + 1];
278 | }
279 |
280 | NSRange obj1RightSignRange = [faceKey rangeOfString:FaceRightSign];
281 | if (obj1RightSignRange.location != NSNotFound) {
282 | faceKey = [faceKey substringToIndex:obj1RightSignRange.location];
283 | }
284 |
285 | return faceKey;
286 | }
287 | @end
288 |
--------------------------------------------------------------------------------
/WBTextKitTools/FaceView/WBFaceView.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
39 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/WBTextKitTools/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "29x29",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "40x40",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "40x40",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "60x60",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "60x60",
31 | "scale" : "3x"
32 | }
33 | ],
34 | "info" : {
35 | "version" : 1,
36 | "author" : "xcode"
37 | }
38 | }
--------------------------------------------------------------------------------
/WBTextKitTools/Images.xcassets/LaunchImage.launchimage/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "orientation" : "portrait",
5 | "idiom" : "iphone",
6 | "minimum-system-version" : "7.0",
7 | "scale" : "2x"
8 | },
9 | {
10 | "orientation" : "portrait",
11 | "idiom" : "iphone",
12 | "minimum-system-version" : "7.0",
13 | "subtype" : "retina4",
14 | "scale" : "2x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/WBTextKitTools/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | com.mcds.app.ios.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/001@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/001@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/002@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/002@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/003@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/003@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/004@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/004@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/005@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/005@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/006@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/006@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/007@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/007@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/008@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/008@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/009@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/009@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/010@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/010@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/011@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/011@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/012@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/012@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/013@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/013@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/014@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/014@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/015@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/015@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/016@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/016@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/017@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/017@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/018@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/018@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/019@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/019@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/020@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/020@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/021@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/021@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/022@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/022@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/023@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/023@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/024@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/024@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/025@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/025@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/026@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/026@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/027@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/027@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/028@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/028@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/029@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/029@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/030@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/030@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/031@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/031@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/032@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/032@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/033@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/033@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/034@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/034@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/035@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/035@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/036@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/036@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/037@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/037@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/038@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/038@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/039@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/039@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/040@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/040@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/041@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/041@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/042@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/042@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/043@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/043@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/044@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/044@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/045@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/045@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/046@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/046@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/047@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/047@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/048@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/048@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/049@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/049@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/050@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/050@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/051@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/051@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/052@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/052@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/053@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/053@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/054@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/054@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/055@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/055@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/056@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/056@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/057@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/057@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/058@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/058@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/059@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/059@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/060@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/060@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/061@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/061@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/062@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/062@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/063@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/063@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/064@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/064@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/065@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/065@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/066@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/066@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/067@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/067@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/068@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/068@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/069@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/069@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/070@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/070@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/071@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/071@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/072@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/072@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/073@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/073@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/074@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/074@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/075@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/075@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/076@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/076@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/077@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/077@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/078@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/078@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/079@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/079@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/080@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/080@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/081@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/081@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/082@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/082@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/083@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/083@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/084@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/084@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/085@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/085@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/086@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/086@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/087@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/087@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/088@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/088@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/089@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/089@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/090@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/090@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/091@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/091@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/092@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/092@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/093@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/093@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/094@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/094@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/095@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/095@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/096@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/096@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/097@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/097@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/098@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/098@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/099@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/099@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/100@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/100@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/101@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/101@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/102@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/102@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/103@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/103@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/104@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/104@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/105@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/105@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/106@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/106@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/107@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/107@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/108@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/108@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/109@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/109@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/110@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/110@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/111@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/111@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/112@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/112@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/113@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/113@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/114@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/114@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/115@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/115@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/116@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/116@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/117@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/117@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/118@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/118@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/119@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/119@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/120@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/120@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/121@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/121@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/122@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/122@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/123@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/123@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/124@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/124@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/125@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/125@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/126@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/126@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/127@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/127@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/128@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/128@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/129@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/129@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/130@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/130@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/131@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/131@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/132@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/132@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/133@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/133@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/134@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/134@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/135@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/135@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/136@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/136@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/137@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/137@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/138@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/138@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/139@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/139@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/140@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/140@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/GIF/141@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/GIF/141@2x.gif
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/001@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/001@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/002@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/002@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/003@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/003@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/004@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/004@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/005@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/005@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/006@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/006@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/007@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/007@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/008@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/008@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/009@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/009@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/010@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/010@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/011@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/011@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/012@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/012@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/013@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/013@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/014@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/014@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/015@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/015@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/016@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/016@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/017@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/017@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/018@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/018@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/019@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/019@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/020@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/020@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/021@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/021@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/022@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/022@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/023@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/023@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/024@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/024@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/025@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/025@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/026@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/026@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/027@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/027@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/028@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/028@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/029@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/029@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/030@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/030@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/031@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/031@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/032@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/032@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/033@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/033@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/034@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/034@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/035@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/035@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/036@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/036@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/037@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/037@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/038@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/038@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/039@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/039@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/040@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/040@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/041@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/041@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/042@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/042@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/043@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/043@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/044@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/044@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/045@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/045@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/046@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/046@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/047@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/047@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/048@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/048@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/049@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/049@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/050@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/050@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/051@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/051@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/052@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/052@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/053@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/053@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/054@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/054@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/055@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/055@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/056@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/056@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/057@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/057@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/058@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/058@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/059@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/059@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/060@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/060@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/061@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/061@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/062@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/062@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/063@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/063@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/064@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/064@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/065@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/065@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/066@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/066@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/067@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/067@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/068@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/068@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/069@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/069@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/070@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/070@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/071@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/071@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/072@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/072@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/073@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/073@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/074@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/074@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/075@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/075@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/076@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/076@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/077@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/077@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/078@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/078@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/079@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/079@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/080@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/080@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/081@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/081@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/082@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/082@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/083@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/083@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/084@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/084@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/085@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/085@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/086@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/086@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/087@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/087@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/088@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/088@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/089@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/089@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/090@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/090@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/091@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/091@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/092@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/092@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/093@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/093@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/094@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/094@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/095@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/095@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/096@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/096@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/097@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/097@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/098@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/098@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/099@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/099@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/100@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/100@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/101@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/101@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/102@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/102@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/103@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/103@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/104@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/104@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/105@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/105@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/106@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/106@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/107@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/107@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/108@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/108@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/109@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/109@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/110@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/110@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/111@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/111@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/112@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/112@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/113@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/113@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/114@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/114@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/115@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/115@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/116@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/116@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/117@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/117@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/118@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/118@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/119@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/119@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/120@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/120@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/121@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/121@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/122@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/122@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/123@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/123@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/124@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/124@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/125@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/125@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/126@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/126@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/127@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/127@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/128@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/128@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/129@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/129@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/130@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/130@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/131@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/131@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/132@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/132@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/133@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/133@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/134@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/134@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/135@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/135@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/136@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/136@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/137@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/137@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/138@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/138@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/139@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/139@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/140@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/140@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/PNG/141@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Face/PNG/141@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/emotionGifImage.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | [001]
6 | 001@2x.gif
7 | [002]
8 | 002@2x.gif
9 | [003]
10 | 003@2x.gif
11 | [004]
12 | 004@2x.gif
13 | [005]
14 | 005@2x.gif
15 | [006]
16 | 006@2x.gif
17 | [007]
18 | 007@2x.gif
19 | [008]
20 | 008@2x.gif
21 | [009]
22 | 009@2x.gif
23 | [010]
24 | 010@2x.gif
25 | [011]
26 | 011@2x.gif
27 | [012]
28 | 012@2x.gif
29 | [013]
30 | 013@2x.gif
31 | [014]
32 | 014@2x.gif
33 | [015]
34 | 015@2x.gif
35 | [016]
36 | 016@2x.gif
37 | [017]
38 | 017@2x.gif
39 | [018]
40 | 018@2x.gif
41 | [019]
42 | 019@2x.gif
43 | [020]
44 | 020@2x.gif
45 | [021]
46 | 021@2x.gif
47 | [022]
48 | 022@2x.gif
49 | [023]
50 | 023@2x.gif
51 | [024]
52 | 024@2x.gif
53 | [025]
54 | 025@2x.gif
55 | [026]
56 | 026@2x.gif
57 | [027]
58 | 027@2x.gif
59 | [028]
60 | 028@2x.gif
61 | [029]
62 | 029@2x.gif
63 | [030]
64 | 030@2x.gif
65 | [031]
66 | 031@2x.gif
67 | [032]
68 | 032@2x.gif
69 | [033]
70 | 033@2x.gif
71 | [034]
72 | 034@2x.gif
73 | [035]
74 | 035@2x.gif
75 | [036]
76 | 036@2x.gif
77 | [037]
78 | 037@2x.gif
79 | [038]
80 | 038@2x.gif
81 | [039]
82 | 039@2x.gif
83 | [040]
84 | 040@2x.gif
85 | [041]
86 | 041@2x.gif
87 | [042]
88 | 042@2x.gif
89 | [043]
90 | 043@2x.gif
91 | [044]
92 | 044@2x.gif
93 | [045]
94 | 045@2x.gif
95 | [046]
96 | 046@2x.gif
97 | [047]
98 | 047@2x.gif
99 | [048]
100 | 048@2x.gif
101 | [049]
102 | 049@2x.gif
103 | [050]
104 | 050@2x.gif
105 | [051]
106 | 051@2x.gif
107 | [052]
108 | 052@2x.gif
109 | [053]
110 | 053@2x.gif
111 | [054]
112 | 054@2x.gif
113 | [055]
114 | 055@2x.gif
115 | [056]
116 | 056@2x.gif
117 | [057]
118 | 057@2x.gif
119 | [058]
120 | 058@2x.gif
121 | [059]
122 | 059@2x.gif
123 | [060]
124 | 060@2x.gif
125 | [061]
126 | 061@2x.gif
127 | [062]
128 | 062@2x.gif
129 | [063]
130 | 063@2x.gif
131 | [064]
132 | 064@2x.gif
133 | [065]
134 | 065@2x.gif
135 | [066]
136 | 066@2x.gif
137 | [067]
138 | 067@2x.gif
139 | [068]
140 | 068@2x.gif
141 | [069]
142 | 069@2x.gif
143 | [070]
144 | 070@2x.gif
145 | [071]
146 | 071@2x.gif
147 | [072]
148 | 072@2x.gif
149 | [073]
150 | 073@2x.gif
151 | [074]
152 | 074@2x.gif
153 | [075]
154 | 075@2x.gif
155 | [076]
156 | 076@2x.gif
157 | [077]
158 | 077@2x.gif
159 | [078]
160 | 078@2x.gif
161 | [079]
162 | 079@2x.gif
163 | [080]
164 | 080@2x.gif
165 | [081]
166 | 081@2x.gif
167 | [082]
168 | 082@2x.gif
169 | [083]
170 | 083@2x.gif
171 | [084]
172 | 084@2x.gif
173 | [085]
174 | 085@2x.gif
175 | [086]
176 | 086@2x.gif
177 | [087]
178 | 087@2x.gif
179 | [088]
180 | 088@2x.gif
181 | [089]
182 | 089@2x.gif
183 | [090]
184 | 090@2x.gif
185 | [091]
186 | 091@2x.gif
187 | [092]
188 | 092@2x.gif
189 | [093]
190 | 093@2x.gif
191 | [094]
192 | 094@2x.gif
193 | [095]
194 | 095@2x.gif
195 | [096]
196 | 096@2x.gif
197 | [097]
198 | 097@2x.gif
199 | [098]
200 | 098@2x.gif
201 | [099]
202 | 099@2x.gif
203 | [100]
204 | 100@2x.gif
205 | [101]
206 | 101@2x.gif
207 | [102]
208 | 102@2x.gif
209 | [103]
210 | 103@2x.gif
211 | [104]
212 | 104@2x.gif
213 | [105]
214 | 105@2x.gif
215 | [106]
216 | 106@2x.gif
217 | [107]
218 | 107@2x.gif
219 | [108]
220 | 108@2x.gif
221 | [109]
222 | 109@2x.gif
223 | [110]
224 | 110@2x.gif
225 | [111]
226 | 111@2x.gif
227 | [112]
228 | 112@2x.gif
229 | [113]
230 | 113@2x.gif
231 | [114]
232 | 114@2x.gif
233 | [115]
234 | 115@2x.gif
235 | [116]
236 | 116@2x.gif
237 | [117]
238 | 117@2x.gif
239 | [118]
240 | 118@2x.gif
241 | [119]
242 | 119@2x.gif
243 | [120]
244 | 120@2x.gif
245 | [121]
246 | 121@2x.gif
247 | [122]
248 | 122@2x.gif
249 | [123]
250 | 123@2x.gif
251 | [124]
252 | 124@2x.gif
253 | [125]
254 | 125@2x.gif
255 | [126]
256 | 126@2x.gif
257 | [127]
258 | 127@2x.gif
259 | [128]
260 | 128@2x.gif
261 | [129]
262 | 129@2x.gif
263 | [130]
264 | 130@2x.gif
265 | [131]
266 | 131@2x.gif
267 | [132]
268 | 132@2x.gif
269 | [133]
270 | 133@2x.gif
271 | [134]
272 | 134@2x.gif
273 | [135]
274 | 135@2x.gif
275 | [136]
276 | 136@2x.gif
277 | [137]
278 | 137@2x.gif
279 | [138]
280 | 138@2x.gif
281 | [139]
282 | 139@2x.gif
283 | [140]
284 | 140@2x.gif
285 | [141]
286 | 141@2x.gif
287 |
288 |
289 |
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Face/emotionPngImage.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | [001]
6 | 001.png
7 | [002]
8 | 002.png
9 | [003]
10 | 003.png
11 | [004]
12 | 004.png
13 | [005]
14 | 005.png
15 | [006]
16 | 006.png
17 | [007]
18 | 007.png
19 | [008]
20 | 008.png
21 | [009]
22 | 009.png
23 | [010]
24 | 010.png
25 | [011]
26 | 011.png
27 | [012]
28 | 012.png
29 | [013]
30 | 013.png
31 | [014]
32 | 014.png
33 | [015]
34 | 015.png
35 | [016]
36 | 016.png
37 | [017]
38 | 017.png
39 | [018]
40 | 018.png
41 | [019]
42 | 019.png
43 | [020]
44 | 020.png
45 | [021]
46 | 021.png
47 | [022]
48 | 022.png
49 | [023]
50 | 023.png
51 | [024]
52 | 024.png
53 | [025]
54 | 025.png
55 | [026]
56 | 026.png
57 | [027]
58 | 027.png
59 | [028]
60 | 028.png
61 | [029]
62 | 029.png
63 | [030]
64 | 030.png
65 | [031]
66 | 031.png
67 | [032]
68 | 032.png
69 | [033]
70 | 033.png
71 | [034]
72 | 034.png
73 | [035]
74 | 035.png
75 | [036]
76 | 036.png
77 | [037]
78 | 037.png
79 | [038]
80 | 038.png
81 | [039]
82 | 039.png
83 | [040]
84 | 040.png
85 | [041]
86 | 041.png
87 | [042]
88 | 042.png
89 | [043]
90 | 043.png
91 | [044]
92 | 044.png
93 | [045]
94 | 045.png
95 | [046]
96 | 046.png
97 | [047]
98 | 047.png
99 | [048]
100 | 048.png
101 | [049]
102 | 049.png
103 | [050]
104 | 050.png
105 | [051]
106 | 051.png
107 | [052]
108 | 052.png
109 | [053]
110 | 053.png
111 | [054]
112 | 054.png
113 | [055]
114 | 055.png
115 | [056]
116 | 056.png
117 | [057]
118 | 057.png
119 | [058]
120 | 058.png
121 | [059]
122 | 059.png
123 | [060]
124 | 060.png
125 | [061]
126 | 061.png
127 | [062]
128 | 062.png
129 | [063]
130 | 063.png
131 | [064]
132 | 064.png
133 | [065]
134 | 065.png
135 | [066]
136 | 066.png
137 | [067]
138 | 067.png
139 | [068]
140 | 068.png
141 | [069]
142 | 069.png
143 | [070]
144 | 070.png
145 | [071]
146 | 071.png
147 | [072]
148 | 072.png
149 | [073]
150 | 073.png
151 | [074]
152 | 074.png
153 | [075]
154 | 075.png
155 | [076]
156 | 076.png
157 | [077]
158 | 077.png
159 | [078]
160 | 078.png
161 | [079]
162 | 079.png
163 | [080]
164 | 080.png
165 | [081]
166 | 081.png
167 | [082]
168 | 082.png
169 | [083]
170 | 083.png
171 | [084]
172 | 084.png
173 | [085]
174 | 085.png
175 | [086]
176 | 086.png
177 | [087]
178 | 087.png
179 | [088]
180 | 088.png
181 | [089]
182 | 089.png
183 | [090]
184 | 090.png
185 | [091]
186 | 091.png
187 | [092]
188 | 092.png
189 | [093]
190 | 093.png
191 | [094]
192 | 094.png
193 | [095]
194 | 095.png
195 | [096]
196 | 096.png
197 | [097]
198 | 097.png
199 | [098]
200 | 098.png
201 | [099]
202 | 099.png
203 | [100]
204 | 100.png
205 | [101]
206 | 101.png
207 | [102]
208 | 102.png
209 | [103]
210 | 103.png
211 | [104]
212 | 104.png
213 | [105]
214 | 105.png
215 | [106]
216 | 106.png
217 | [107]
218 | 107.png
219 | [108]
220 | 108.png
221 | [109]
222 | 109.png
223 | [110]
224 | 110.png
225 | [111]
226 | 111.png
227 | [112]
228 | 112.png
229 | [113]
230 | 113.png
231 | [114]
232 | 114.png
233 | [115]
234 | 115.png
235 | [116]
236 | 116.png
237 | [117]
238 | 117.png
239 | [118]
240 | 118.png
241 | [119]
242 | 119.png
243 | [120]
244 | 120.png
245 | [121]
246 | 121.png
247 | [122]
248 | 122.png
249 | [123]
250 | 123.png
251 | [124]
252 | 124.png
253 | [125]
254 | 125.png
255 | [126]
256 | 126.png
257 | [127]
258 | 127.png
259 | [128]
260 | 128.png
261 | [129]
262 | 129.png
263 | [130]
264 | 130.png
265 | [131]
266 | 131.png
267 | [132]
268 | 132.png
269 | [133]
270 | 133.png
271 | [134]
272 | 134.png
273 | [135]
274 | 135.png
275 | [136]
276 | 136.png
277 | [137]
278 | 137.png
279 | [138]
280 | 138.png
281 | [139]
282 | 139.png
283 | [140]
284 | 140.png
285 | [141]
286 | 141.png
287 |
288 |
289 |
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Image/face_delete@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Image/face_delete@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Image/face_delete_pressed@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Image/face_delete_pressed@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Image/qvip_emoji_tab_classic@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Image/qvip_emoji_tab_classic@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Image/qvip_emoji_tab_classic_pressed@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Image/qvip_emoji_tab_classic_pressed@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Image/qvip_emoji_tab_history@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Image/qvip_emoji_tab_history@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Image/qvip_emoji_tab_history_pressed@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Image/qvip_emoji_tab_history_pressed@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Image/transparent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Image/transparent.png
--------------------------------------------------------------------------------
/WBTextKitTools/Resource/Image/transparent@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wangbo6886/WBTextKitTools/8461aa823fa6c8cb17fac80ec0cde9edd03ad48f/WBTextKitTools/Resource/Image/transparent@2x.png
--------------------------------------------------------------------------------
/WBTextKitTools/ThirdPartyTools/YLGIFImage/YLGIFImage.h:
--------------------------------------------------------------------------------
1 | //
2 | // YLGIFImage.h
3 | // YLGIFImage
4 | //
5 | // Created by Yong Li on 14-3-2.
6 | // Copyright (c) 2014年 Yong Li. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YLGIFImage : UIImage
12 |
13 | ///-----------------------
14 | /// @name Image Attributes
15 | ///-----------------------
16 |
17 | /**
18 | A C array containing the frame durations.
19 |
20 | The number of frames is defined by the count of the `images` array property.
21 | */
22 | @property (nonatomic, readonly) NSTimeInterval *frameDurations;
23 |
24 | /**
25 | Total duration of the animated image.
26 | */
27 | @property (nonatomic, readonly) NSTimeInterval totalDuration;
28 |
29 | /**
30 | Number of loops the image can do before it stops
31 | */
32 | @property (nonatomic, readonly) NSUInteger loopCount;
33 |
34 | - (UIImage*)getFrameWithIndex:(NSUInteger)idx;
35 |
36 | @end
37 |
--------------------------------------------------------------------------------
/WBTextKitTools/ThirdPartyTools/YLGIFImage/YLGIFImage.m:
--------------------------------------------------------------------------------
1 | //
2 | // YLGIFImage.m
3 | // YLGIFImage
4 | //
5 | // Created by Yong Li on 14-3-2.
6 | // Copyright (c) 2014年 Yong Li. All rights reserved.
7 | //
8 |
9 | #import "YLGIFImage.h"
10 | #import
11 | #import
12 |
13 |
14 | //Define FLT_EPSILON because, reasons.
15 | //Actually, I don't know why but it seems under certain circumstances it is not defined
16 | #ifndef FLT_EPSILON
17 | #define FLT_EPSILON __FLT_EPSILON__
18 | #endif
19 |
20 | inline static NSTimeInterval CGImageSourceGetGifFrameDelay(CGImageSourceRef imageSource, NSUInteger index)
21 | {
22 | NSTimeInterval frameDuration = 0;
23 | CFDictionaryRef theImageProperties;
24 | if ((theImageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, index, NULL))) {
25 | CFDictionaryRef gifProperties;
26 | if (CFDictionaryGetValueIfPresent(theImageProperties, kCGImagePropertyGIFDictionary, (const void **)&gifProperties)) {
27 | const void *frameDurationValue;
28 | if (CFDictionaryGetValueIfPresent(gifProperties, kCGImagePropertyGIFUnclampedDelayTime, &frameDurationValue)) {
29 | frameDuration = [(__bridge NSNumber *)frameDurationValue doubleValue];
30 | if (frameDuration <= 0) {
31 | if (CFDictionaryGetValueIfPresent(gifProperties, kCGImagePropertyGIFDelayTime, &frameDurationValue)) {
32 | frameDuration = [(__bridge NSNumber *)frameDurationValue doubleValue];
33 | }
34 | }
35 | }
36 | }
37 | CFRelease(theImageProperties);
38 | }
39 |
40 | #ifndef OLExactGIFRepresentation
41 | //Implement as Browsers do.
42 | //See: http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser-compatibility
43 | //Also: http://blogs.msdn.com/b/ieinternals/archive/2010/06/08/animated-gifs-slow-down-to-under-20-frames-per-second.aspx
44 |
45 | if (frameDuration < 0.02 - FLT_EPSILON) {
46 | frameDuration = 0.1;
47 | }
48 | #endif
49 | return frameDuration;
50 | }
51 |
52 | inline static BOOL CGImageSourceContainsAnimatedGif(CGImageSourceRef imageSource)
53 | {
54 | return imageSource && UTTypeConformsTo(CGImageSourceGetType(imageSource), kUTTypeGIF) && CGImageSourceGetCount(imageSource) > 1;
55 | }
56 |
57 | inline static BOOL isRetinaFilePath(NSString *path)
58 | {
59 | NSRange retinaSuffixRange = [[path lastPathComponent] rangeOfString:@"@2x" options:NSCaseInsensitiveSearch];
60 | return retinaSuffixRange.length && retinaSuffixRange.location != NSNotFound;
61 | }
62 |
63 | @interface YLGIFImage ()
64 |
65 | @property (nonatomic, readwrite) NSMutableArray *images;
66 | @property (nonatomic, readwrite) NSTimeInterval *frameDurations;
67 | @property (nonatomic, readwrite) NSTimeInterval totalDuration;
68 | @property (nonatomic, readwrite) NSUInteger loopCount;
69 | @property (nonatomic, readwrite) CGImageSourceRef incrementalSource;
70 |
71 | @end
72 |
73 | static NSUInteger _prefetchedNum = 10;
74 |
75 | @implementation YLGIFImage
76 | {
77 | dispatch_queue_t readFrameQueue;
78 | CGImageSourceRef _imageSourceRef;
79 | CGFloat _scale;
80 | }
81 |
82 | @synthesize images;
83 |
84 | #pragma mark - Class Methods
85 |
86 | + (id)imageNamed:(NSString *)name
87 | {
88 | NSString *path = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:name];
89 |
90 | return ([[NSFileManager defaultManager] fileExistsAtPath:path]) ? [self imageWithContentsOfFile:path] : nil;
91 | }
92 |
93 | + (id)imageWithContentsOfFile:(NSString *)path
94 | {
95 | return [self imageWithData:[NSData dataWithContentsOfFile:path]
96 | scale:isRetinaFilePath(path) ? 2.0f : 1.0f];
97 | }
98 |
99 | + (id)imageWithData:(NSData *)data
100 | {
101 | return [self imageWithData:data scale:1.0f];
102 | }
103 |
104 | + (id)imageWithData:(NSData *)data scale:(CGFloat)scale
105 | {
106 | if (!data) {
107 | return nil;
108 | }
109 |
110 | CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)(data), NULL);
111 | UIImage *image;
112 |
113 | if (CGImageSourceContainsAnimatedGif(imageSource)) {
114 | image = [[self alloc] initWithCGImageSource:imageSource scale:scale];
115 | } else {
116 | image = [super imageWithData:data scale:scale];
117 | }
118 |
119 | if (imageSource) {
120 | CFRelease(imageSource);
121 | }
122 |
123 | return image;
124 | }
125 |
126 | #pragma mark - Initialization methods
127 |
128 | - (id)initWithContentsOfFile:(NSString *)path
129 | {
130 | return [self initWithData:[NSData dataWithContentsOfFile:path]
131 | scale:isRetinaFilePath(path) ? 2.0f : 1.0f];
132 | }
133 |
134 | - (id)initWithData:(NSData *)data
135 | {
136 | return [self initWithData:data scale:1.0f];
137 | }
138 |
139 | - (id)initWithData:(NSData *)data scale:(CGFloat)scale
140 | {
141 | if (!data) {
142 | return nil;
143 | }
144 |
145 | CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)(data), NULL);
146 |
147 | if (CGImageSourceContainsAnimatedGif(imageSource)) {
148 | self = [self initWithCGImageSource:imageSource scale:scale];
149 | } else {
150 | if (scale == 1.0f) {
151 | self = [super initWithData:data];
152 | } else {
153 | self = [super initWithData:data scale:scale];
154 | }
155 | }
156 |
157 | if (imageSource) {
158 | CFRelease(imageSource);
159 | }
160 |
161 | return self;
162 | }
163 |
164 | - (id)initWithCGImageSource:(CGImageSourceRef)imageSource scale:(CGFloat)scale
165 | {
166 | self = [super init];
167 | if (!imageSource || !self) {
168 | return nil;
169 | }
170 |
171 | CFRetain(imageSource);
172 |
173 | NSUInteger numberOfFrames = CGImageSourceGetCount(imageSource);
174 |
175 | NSDictionary *imageProperties = CFBridgingRelease(CGImageSourceCopyProperties(imageSource, NULL));
176 | NSDictionary *gifProperties = [imageProperties objectForKey:(NSString *)kCGImagePropertyGIFDictionary];
177 |
178 | self.frameDurations = (NSTimeInterval *)malloc(numberOfFrames * sizeof(NSTimeInterval));
179 | self.loopCount = [gifProperties[(NSString *)kCGImagePropertyGIFLoopCount] unsignedIntegerValue];
180 | self.images = [NSMutableArray arrayWithCapacity:numberOfFrames];
181 |
182 | NSNull *aNull = [NSNull null];
183 | for (NSUInteger i = 0; i < numberOfFrames; ++i) {
184 | [self.images addObject:aNull];
185 | NSTimeInterval frameDuration = CGImageSourceGetGifFrameDelay(imageSource, i);
186 | self.frameDurations[i] = frameDuration;
187 | self.totalDuration += frameDuration;
188 | }
189 | //CFTimeInterval start = CFAbsoluteTimeGetCurrent();
190 | // Load first frame
191 | NSUInteger num = MIN(_prefetchedNum, numberOfFrames);
192 | for (NSUInteger i=0; i _prefetchedNum) {
222 | if(idx != 0) {
223 | [self.images replaceObjectAtIndex:idx withObject:[NSNull null]];
224 | }
225 | NSUInteger nextReadIdx = (idx + _prefetchedNum);
226 | for(NSUInteger i=idx+1; i<=nextReadIdx; i++) {
227 | NSUInteger _idx = i%self.images.count;
228 | if([self.images[_idx] isKindOfClass:[NSNull class]]) {
229 | dispatch_async(readFrameQueue, ^{
230 | CGImageRef image = CGImageSourceCreateImageAtIndex(_imageSourceRef, _idx, NULL);
231 | @synchronized(self.images) {
232 | [self.images replaceObjectAtIndex:_idx withObject:[UIImage imageWithCGImage:image scale:_scale orientation:UIImageOrientationUp]];
233 | }
234 | CFRelease(image);
235 | });
236 | }
237 | }
238 | }
239 | return frame;
240 | }
241 |
242 | #pragma mark - Compatibility methods
243 |
244 | - (CGSize)size
245 | {
246 | if (self.images.count) {
247 | return [[self.images objectAtIndex:0] size];
248 | }
249 | return [super size];
250 | }
251 |
252 | - (CGImageRef)CGImage
253 | {
254 | if (self.images.count) {
255 | return [[self.images objectAtIndex:0] CGImage];
256 | } else {
257 | return [super CGImage];
258 | }
259 | }
260 |
261 | - (UIImageOrientation)imageOrientation
262 | {
263 | if (self.images.count) {
264 | return [[self.images objectAtIndex:0] imageOrientation];
265 | } else {
266 | return [super imageOrientation];
267 | }
268 | }
269 |
270 | - (CGFloat)scale
271 | {
272 | if (self.images.count) {
273 | return [(UIImage *)[self.images objectAtIndex:0] scale];
274 | } else {
275 | return [super scale];
276 | }
277 | }
278 |
279 | - (NSTimeInterval)duration
280 | {
281 | return self.images ? self.totalDuration : [super duration];
282 | }
283 |
284 | - (void)dealloc {
285 | if(_imageSourceRef) {
286 | CFRelease(_imageSourceRef);
287 | }
288 | free(_frameDurations);
289 | if (_incrementalSource) {
290 | CFRelease(_incrementalSource);
291 | }
292 | }
293 |
294 | @end
--------------------------------------------------------------------------------
/WBTextKitTools/ThirdPartyTools/YLGIFImage/YLImageView.h:
--------------------------------------------------------------------------------
1 | //
2 | // YLImageView.h
3 | // YLGIFImage
4 | //
5 | // Created by Yong Li on 14-3-2.
6 | // Copyright (c) 2014年 Yong Li. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface YLImageView : UIImageView
12 |
13 | @property (nonatomic, copy) NSString *runLoopMode;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/WBTextKitTools/ThirdPartyTools/YLGIFImage/YLImageView.m:
--------------------------------------------------------------------------------
1 | //
2 | // YLImageView.m
3 | // YLGIFImage
4 | //
5 | // Created by Yong Li on 14-3-2.
6 | // Copyright (c) 2014年 Yong Li. All rights reserved.
7 | //
8 |
9 | #import "YLImageView.h"
10 | #import "YLGIFImage.h"
11 | #import
12 |
13 | @interface YLImageView ()
14 |
15 | @property (nonatomic, strong) YLGIFImage *animatedImage;
16 | @property (nonatomic, strong) CADisplayLink *displayLink;
17 | @property (nonatomic) NSTimeInterval accumulator;
18 | @property (nonatomic) NSUInteger currentFrameIndex;
19 | @property (nonatomic, strong) UIImage* currentFrame;
20 | @property (nonatomic) NSUInteger loopCountdown;
21 |
22 | @end
23 |
24 | @implementation YLImageView
25 |
26 | const NSTimeInterval kMaxTimeStep = 1; // note: To avoid spiral-o-death
27 |
28 | @synthesize runLoopMode = _runLoopMode;
29 | @synthesize displayLink = _displayLink;
30 |
31 | - (id)init
32 | {
33 | self = [super init];
34 | if (self) {
35 | self.currentFrameIndex = 0;
36 | }
37 | return self;
38 | }
39 |
40 | - (CADisplayLink *)displayLink
41 | {
42 | if (self.superview) {
43 | if (!_displayLink && self.animatedImage) {
44 | _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(changeKeyframe:)];
45 | [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:self.runLoopMode];
46 | }
47 | } else {
48 | [_displayLink invalidate];
49 | _displayLink = nil;
50 | }
51 | return _displayLink;
52 | }
53 |
54 | - (NSString *)runLoopMode
55 | {
56 | return _runLoopMode ?: NSRunLoopCommonModes;
57 | }
58 |
59 | - (void)setRunLoopMode:(NSString *)runLoopMode
60 | {
61 | if (runLoopMode != _runLoopMode) {
62 | [self stopAnimating];
63 |
64 | NSRunLoop *runloop = [NSRunLoop mainRunLoop];
65 | [self.displayLink removeFromRunLoop:runloop forMode:_runLoopMode];
66 | [self.displayLink addToRunLoop:runloop forMode:runLoopMode];
67 |
68 | _runLoopMode = runLoopMode;
69 |
70 | [self startAnimating];
71 | }
72 | }
73 |
74 | - (void)setImage:(UIImage *)image
75 | {
76 | if (image == self.image) {
77 | return;
78 | }
79 |
80 | [self stopAnimating];
81 |
82 | self.currentFrameIndex = 0;
83 | self.loopCountdown = 0;
84 | self.accumulator = 0;
85 |
86 | if ([image isKindOfClass:[YLGIFImage class]] && image.images) {
87 | if([image.images[0] isKindOfClass:UIImage.class])
88 | [super setImage:image.images[0]];
89 | else
90 | [super setImage:nil];
91 | self.currentFrame = nil;
92 | self.animatedImage = (YLGIFImage *)image;
93 | self.loopCountdown = self.animatedImage.loopCount ?: NSUIntegerMax;
94 | [self startAnimating];
95 | } else {
96 | self.animatedImage = nil;
97 | [super setImage:image];
98 | }
99 | [self.layer setNeedsDisplay];
100 | }
101 |
102 | - (void)setAnimatedImage:(YLGIFImage *)animatedImage
103 | {
104 | _animatedImage = animatedImage;
105 | if (animatedImage == nil) {
106 | self.layer.contents = nil;
107 | }
108 | }
109 |
110 | - (BOOL)isAnimating
111 | {
112 | return [super isAnimating] || (self.displayLink && !self.displayLink.isPaused);
113 | }
114 |
115 | - (void)stopAnimating
116 | {
117 | if (!self.animatedImage) {
118 | [super stopAnimating];
119 | return;
120 | }
121 |
122 | self.loopCountdown = 0;
123 |
124 | self.displayLink.paused = YES;
125 | }
126 |
127 | - (void)startAnimating
128 | {
129 | if (!self.animatedImage) {
130 | [super startAnimating];
131 | return;
132 | }
133 |
134 | if (self.isAnimating) {
135 | return;
136 | }
137 |
138 | self.loopCountdown = self.animatedImage.loopCount ?: NSUIntegerMax;
139 |
140 | self.displayLink.paused = NO;
141 | }
142 |
143 | - (void)changeKeyframe:(CADisplayLink *)displayLink
144 | {
145 | if (self.currentFrameIndex >= [self.animatedImage.images count]) {
146 | return;
147 | }
148 | self.accumulator += fmin(displayLink.duration, kMaxTimeStep);
149 |
150 | while (self.accumulator >= self.animatedImage.frameDurations[self.currentFrameIndex]) {
151 | self.accumulator -= self.animatedImage.frameDurations[self.currentFrameIndex];
152 | if (++self.currentFrameIndex >= [self.animatedImage.images count]) {
153 | if (--self.loopCountdown == 0) {
154 | [self stopAnimating];
155 | return;
156 | }
157 | self.currentFrameIndex = 0;
158 | }
159 | self.currentFrameIndex = MIN(self.currentFrameIndex, [self.animatedImage.images count] - 1);
160 | self.currentFrame = [self.animatedImage getFrameWithIndex:self.currentFrameIndex];
161 | [self.layer setNeedsDisplay];
162 | }
163 | }
164 |
165 | - (void)displayLayer:(CALayer *)layer
166 | {
167 | if (!self.animatedImage || [self.animatedImage.images count] == 0) {
168 | return;
169 | }
170 | //NSLog(@"display index: %luu", (unsigned long)self.currentFrameIndex);
171 | if(self.currentFrame && ![self.currentFrame isKindOfClass:[NSNull class]])
172 | layer.contents = (__bridge id)([self.currentFrame CGImage]);
173 | }
174 |
175 | - (void)didMoveToWindow
176 | {
177 | [super didMoveToWindow];
178 | if (self.window) {
179 | [self startAnimating];
180 | } else {
181 | dispatch_async(dispatch_get_main_queue(), ^{
182 | if (!self.window) {
183 | [self stopAnimating];
184 | }
185 | });
186 | }
187 | }
188 |
189 | - (void)didMoveToSuperview
190 | {
191 | [super didMoveToSuperview];
192 | if (self.superview) {
193 | //Has a superview, make sure it has a displayLink
194 | [self displayLink];
195 | } else {
196 | //Doesn't have superview, let's check later if we need to remove the displayLink
197 | dispatch_async(dispatch_get_main_queue(), ^{
198 | [self displayLink];
199 | });
200 | }
201 | }
202 |
203 | - (void)setHighlighted:(BOOL)highlighted
204 | {
205 | if (!self.animatedImage) {
206 | [super setHighlighted:highlighted];
207 | }
208 | }
209 |
210 | - (UIImage *)image
211 | {
212 | return self.animatedImage ?: [super image];
213 | }
214 |
215 | - (CGSize)sizeThatFits:(CGSize)size
216 | {
217 | return self.image.size;
218 | }
219 |
220 | @end
221 |
222 |
--------------------------------------------------------------------------------
/WBTextKitTools/ViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.h
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/11/20.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "WBTextView.h"
11 |
12 | @interface ViewController : UIViewController
13 |
14 |
15 | @end
16 |
17 |
--------------------------------------------------------------------------------
/WBTextKitTools/ViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.m
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/11/20.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import "ViewController.h"
10 | #import "WBTextStorage.h"
11 | #import "WBFaceView.h"
12 |
13 | @interface ViewController (){
14 | WBTextStorage *_wbTextStorage;
15 | WBTextView *_textView;
16 | WBTextView *_noEditableTextView;
17 | WBFaceView *_faceView;
18 | }
19 |
20 | @end
21 |
22 | @implementation ViewController
23 |
24 |
25 | - (void)viewDidLoad
26 | {
27 | [super viewDidLoad];
28 |
29 | self.view.backgroundColor = [UIColor whiteColor];
30 |
31 | UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithTitle:@"表情"
32 | style:UIBarButtonItemStylePlain
33 | target:self
34 | action:@selector(faceKeyboardShow)];
35 | self.navigationItem.rightBarButtonItem = rightItem;
36 |
37 | //editable = YES
38 | UILabel *editableLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)];
39 | editableLabel.text = @"编辑用:";
40 | [self.view addSubview:editableLabel];
41 |
42 | _textView = [[WBTextView alloc]initWithFrame:CGRectMake(0, editableLabel.frame.size.height + 10, self.view.frame.size.width, 150) textContainer:nil];
43 | _textView.editable = YES;
44 | _textView.wbDelegate = self;
45 | _textView.backgroundColor = [UIColor yellowColor];
46 | _textView.font = [UIFont fontWithName:@"HelveticaNeue" size:17.0];
47 | _textView.delegate = self;
48 | //注意先后关系,文本必须在最后设置
49 | _textView.text = @"可以写入@123#456 以及网址 http://www.baidu.com [001][002]等内容。。。";
50 | [self.view addSubview:_textView];
51 |
52 | //editable = NO
53 | UILabel *noEditableLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, _textView.frame.origin.y + _textView.frame.size.height + 10 - 64, self.view.frame.size.width, 20)];
54 | noEditableLabel.text = @"显示用:";
55 | [self.view addSubview:noEditableLabel];
56 |
57 | _noEditableTextView = [[WBTextView alloc]initWithFrame:CGRectMake(0, noEditableLabel.frame.origin.y + noEditableLabel.frame.size.height + 10, self.view.frame.size.width, 150)];
58 | _noEditableTextView.editable = NO;
59 | _noEditableTextView.backgroundColor = [UIColor yellowColor];
60 | _noEditableTextView.font = [UIFont fontWithName:@"HelveticaNeue" size:17.0];
61 | _noEditableTextView.text = _textView.text;
62 | [self.view addSubview:_noEditableTextView];
63 |
64 | //这里是点击特殊字符后要做的事情
65 | [_noEditableTextView setDetectionBlock:^(WBTextKeyWord hotWord, NSString *string, NSString *protocol, NSRange range) {
66 | NSArray *hotWords = @[@"WBTextKeyWordAt", @"WBTextKeyWordPound"];
67 | NSString *myString = [NSString stringWithFormat:@"%@ [%d,%d]: %@%@", hotWords[hotWord], (int)range.location, (int)range.length, string, (protocol != nil) ? [NSString stringWithFormat:@" *%@*", protocol] : @""];
68 | NSLog(@"%@",myString);
69 | }];
70 | }
71 |
72 | - (void)didReceiveMemoryWarning {
73 | [super didReceiveMemoryWarning];
74 | }
75 |
76 | #pragma mark -----------------------------------表情键盘
77 | - (void)faceKeyboardShow
78 | {
79 | [_textView resignFirstResponder];
80 |
81 | if (!_faceView) {
82 | _faceView = [[WBFaceView alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height - 223, _faceView.frame.size.width, _faceView.frame.size.height)];
83 | _faceView.faceDelegate = _textView;
84 | [self.view addSubview:_faceView];
85 | }else{
86 | [_faceView removeFromSuperview];
87 | _faceView = nil;
88 | }
89 | }
90 |
91 | #pragma mark -----------------------------------文本被改变
92 | - (void)textViewDidChange:(UITextView *)textView
93 | {
94 | _noEditableTextView.text = _textView.text;
95 | CGRect rect = _noEditableTextView.frame;
96 | rect.size.height = [_noEditableTextView getHeight];
97 | _noEditableTextView.frame = rect;
98 | }
99 |
100 | #pragma mark -----------------------------------表情键盘删除
101 | - (void)WBTextViewDidDeleteFace
102 | {
103 | _noEditableTextView.text = _textView.text;
104 | }
105 | @end
106 |
--------------------------------------------------------------------------------
/WBTextKitTools/WBTextView/WBTextAttachment.h:
--------------------------------------------------------------------------------
1 | //
2 | // WBTextAttachment.h
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/12/8.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface WBTextAttachment : NSTextAttachment
12 |
13 | @property(nonatomic,assign)CGFloat size;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/WBTextKitTools/WBTextView/WBTextAttachment.m:
--------------------------------------------------------------------------------
1 | //
2 | // WBTextAttachment.m
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/12/8.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import "WBTextAttachment.h"
10 |
11 | @implementation WBTextAttachment
12 |
13 | #pragma mark -----------------------------------根据文字大小自己转换附本大小
14 | -(CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer proposedLineFragment:(CGRect)lineFrag glyphPosition:(CGPoint)position characterIndex:(NSUInteger)charIndex
15 | {
16 | return CGRectMake(0 , -2 , self.size , self.size );
17 | }
18 |
19 | @end
20 |
--------------------------------------------------------------------------------
/WBTextKitTools/WBTextView/WBTextStorage.h:
--------------------------------------------------------------------------------
1 | //
2 | // WBTextStorage.h
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/11/24.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | #define KeyWord @"keyWord"
12 | #define KeyRange @"keyRange"
13 | #define UrlProtocol @"urlProtocol"
14 | #define UrlAttributes @"urlAttributes"
15 | #define AttachmentDictionary @"attachmentDictionary"
16 | #define DidProcessEditingNotification @"DidProcessEditing"
17 |
18 | typedef enum {
19 | WBTextKeyWordAt = 0,
20 | WBTextKeyWordPound,
21 | WBTextKeyWordLink
22 | } WBTextKeyWord;
23 |
24 | @interface WBTextStorage : NSTextStorage
25 |
26 | @property (nonatomic, strong) NSMutableArray *rangesOfKeyWords;
27 | @property (nonatomic, strong) NSMutableArray *attachmentRangeArray;
28 | @property (nonatomic, strong) NSMutableDictionary *attachmentDictionary;
29 | @property (nonatomic, assign) NSInteger selectedRangeLocation;
30 | @property (nonatomic, strong) UIFont *font;
31 | @property (nonatomic, strong) NSTextContainer *textContainer;
32 | @property (nonatomic, strong) NSLayoutManager *layouManager;
33 | @property (nonatomic, assign) BOOL editable;
34 |
35 | - (NSString *)getPlainText;
36 | - (BOOL)isEmoji:(NSString *)text;
37 | - (NSString *)isGifEmoji:(NSString *)text;
38 | - (CGFloat)getStringHeightWithSize:(CGSize)size;
39 | @end
40 |
--------------------------------------------------------------------------------
/WBTextKitTools/WBTextView/WBTextStorage.m:
--------------------------------------------------------------------------------
1 | //
2 | // WBTextStorage.m
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/11/24.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import "WBTextStorage.h"
10 | #import "WBTextAttachment.h"
11 |
12 | #define URLRegex @"(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))"
13 | #define EmojiRegex @"\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]"
14 | #define RemoveStringName @"NSRemoveString"
15 | #define RGBColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
16 | #define TextColor RGBColor(0 , 0, 0)
17 | #define AtColor RGBColor(255 , 0 , 0)
18 | #define PoundColor RGBColor(128, 138 , 135)
19 |
20 | @implementation WBTextStorage
21 | {
22 | NSMutableAttributedString *_backingStore;
23 | UIFont *_attributesFont;
24 | NSDictionary *_attributesText;
25 | NSDictionary *_attributesAt;
26 | NSDictionary *_attributesPound;
27 | NSDictionary *_attributesLink;
28 | NSArray *_validProtocols;
29 | NSDictionary *_emojiDictionary;
30 | }
31 |
32 | #pragma mark - 重写一些方法
33 | #pragma mark -
34 | #pragma mark -----------------------------------初始化
35 | - (id)init
36 | {
37 | self = [super init];
38 |
39 | if (self) {
40 | if (_attributesFont == nil) {
41 | _attributesFont = [UIFont fontWithName:@"HelveticaNeue" size:12.0];
42 | [self reSetTextAttributesFont];
43 | }
44 |
45 | _backingStore = [[NSMutableAttributedString alloc] init];
46 | _rangesOfKeyWords = [[NSMutableArray alloc] init];//存储特殊文本的RANGE
47 | _validProtocols = @[@"http", @"https"];//链接协议开头
48 | //表情集合
49 | NSString *emojiFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"emotionGifImage.plist"];
50 | _emojiDictionary = [[NSDictionary alloc] initWithContentsOfFile:emojiFilePath];
51 | _attachmentRangeArray = [[NSMutableArray alloc]init];//存储附本的RANGE
52 | _attachmentDictionary = [[NSMutableDictionary alloc]init];//存储附本的文字内容
53 | }
54 |
55 | return self;
56 | }
57 |
58 | #pragma mark -----------------------------------重写设置文本大小方法
59 | - (void)setFont:(UIFont *)font
60 | {
61 | _attributesFont = font;
62 | [self reSetTextAttributesFont];
63 | }
64 |
65 | #pragma mark -----------------------------------返回当前存储的字符串
66 | - (NSString *)string
67 | {
68 | return [_backingStore string];
69 | }
70 |
71 | #pragma mark -----------------------------------获取指定范围内的文字属性
72 | - (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range
73 | {
74 | return [_backingStore attributesAtIndex:location effectiveRange:range];
75 | }
76 |
77 | #pragma mark -----------------------------------返回当前可变字符串
78 | - (NSAttributedString *)attributedString
79 | {
80 | return _backingStore;
81 | }
82 |
83 | #pragma mark -----------------------------------设置指定范围内的文字属性
84 | - (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range
85 | {
86 | [_backingStore setAttributes:attrs range:range];
87 | [self edited:NSTextStorageEditedAttributes range:range changeInLength:0];
88 | }
89 |
90 | #pragma mark -----------------------------------为指定范围内的文字增加属性
91 | - (void)addAttributes:(NSDictionary *)attrs range:(NSRange)range
92 | {
93 | [_backingStore addAttributes:attrs range:range];
94 | [self edited:NSTextStorageEditedAttributes range:range changeInLength:0];
95 | }
96 |
97 | #pragma mark -----------------------------------移除指定范围内的文字的属性
98 | - (void)removeAttribute:(NSString *)name range:(NSRange)range
99 | {
100 | [_backingStore removeAttribute:name range:range];
101 | [self edited:NSTextStorageEditedAttributes range:range changeInLength:0];
102 | }
103 |
104 | #pragma mark -----------------------------------修改指定范围内的文字
105 | - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)string
106 | {
107 | if (range.length != 0) {
108 | //删除或替换
109 | [self removeAttachmentDictionaryInRange:range];
110 |
111 | NSAttributedString *attributedString = [self attributedSubstringFromRange:range];
112 | if (string.length > 0 && ![self isEmoji:[attributedString string]]) {
113 | [self addInRange:range andText:string];
114 |
115 | NSLog(@"替换后:");
116 | NSLog(@"数组:%@",_attachmentRangeArray);
117 | NSLog(@"字典:%@",_attachmentDictionary);
118 | }
119 | }else{
120 | if (_backingStore.length > 0) {
121 | [self addInRange:range andText:string];
122 | }
123 | }
124 |
125 | [_backingStore replaceCharactersInRange:range withString:string];
126 | [self edited:(NSTextStorageEditedCharacters|NSTextStorageEditedAttributes) range:range changeInLength:string.length - range.length];
127 | }
128 |
129 | #pragma mark -----------------------------------每次文本存储有修改时,这个方法都自动被调用。每次编辑后,NSTextStorage会用这个方法来清理字符串.所以在这个方法中来做一些文本属性刷新的特殊处理
130 | -(void)processEditing
131 | {
132 | [self analyzeSpecialCharacter];
133 | [self analyzeLink];
134 | [self updateText];
135 | [self analyzeImage];
136 |
137 | //别忘记了要继承一下这个方法做系统本身的操作
138 | [super processEditing];
139 |
140 | //这里使用自己的通知,系统自带的NSTextStorageDidProcessEditingNotification通知会触发多次,不好控制
141 | [[NSNotificationCenter defaultCenter]postNotificationName:DidProcessEditingNotification object:nil];
142 | }
143 |
144 | #pragma mark - 私有方法
145 | #pragma mark -
146 | #pragma mark -----------------------------------解析特殊字符的文本
147 | - (void)analyzeSpecialCharacter
148 | {
149 | NSMutableString *tmpText = [[NSMutableString alloc] initWithString:self.string];
150 |
151 | //需要解析的字符 (@ at, # pound)
152 | NSString *keyCharacters = @"@#";
153 | NSCharacterSet *keyCharactersSet = [NSCharacterSet characterSetWithCharactersInString:keyCharacters];
154 |
155 | //特殊文本以哪些字符结尾
156 | NSMutableCharacterSet *validCharactersSet = [NSMutableCharacterSet alphanumericCharacterSet];//字符集
157 | [validCharactersSet removeCharactersInString:@"!@#$%^&*()-={[]}|;:',<>.?/"];//这里传入结尾字符
158 | [validCharactersSet addCharactersInString:@"_"];//可以单独添加特殊的连接字符
159 |
160 | //这里需要先清理一下原先存储的特殊文本内容
161 | [_rangesOfKeyWords removeAllObjects];
162 |
163 | //如果字符串中包含特殊字符的位置小于字符串长度,则进入循环
164 | while ([tmpText rangeOfCharacterFromSet:keyCharactersSet].location < tmpText.length) {
165 | NSRange range = [tmpText rangeOfCharacterFromSet:keyCharactersSet];//得到特殊字符的Range
166 |
167 | WBTextKeyWord keyWord;
168 |
169 | //得到特殊字符的类型
170 | switch ([tmpText characterAtIndex:range.location]) {
171 | case '@':
172 | keyWord = WBTextKeyWordAt;
173 | break;
174 | case '#':
175 | keyWord = WBTextKeyWordPound;
176 | break;
177 | default:
178 | keyWord = -1;
179 | break;
180 | }
181 |
182 | //替换掉已经找到的特殊字符
183 | [tmpText replaceCharactersInRange:range withString:@"%"];
184 |
185 | int length = (int)range.length;//拿到特殊字符的长度
186 |
187 | //从特殊字符之后的位置开始循环找结尾字符
188 | while (range.location + length < tmpText.length) {
189 | //判断当前结尾字符是否为验证集的子集,如果是的话,length加一,继续循环,直到找到不是子集的为止
190 | BOOL charIsMember = [validCharactersSet characterIsMember:[tmpText characterAtIndex:range.location + length]];
191 |
192 | if (charIsMember)
193 | length++;
194 | else
195 | break;
196 | }
197 |
198 | //区分@情况下,为邮箱的字符串
199 | if (keyWord == WBTextKeyWordAt && tmpText.length - range.location - length > 3) {
200 | NSString *emailStr = [tmpText substringWithRange:NSMakeRange(range.location, length + 4)];
201 | [tmpText rangeOfString:@".com"];
202 | NSString *comStr = [emailStr substringFromIndex:emailStr.length - 4];
203 | if (range.location > 0 && [validCharactersSet characterIsMember:[tmpText characterAtIndex:range.location - 1]] && [comStr isEqual:@".com"])
204 | continue;//进行下一次循环
205 | }
206 |
207 | //把找到的特殊字符串,存入数组中用于以后的操作
208 | if (length > 1)
209 | [_rangesOfKeyWords addObject:@{KeyWord: @(keyWord), KeyRange: [NSValue valueWithRange:NSMakeRange(range.location, length)]}];
210 | }
211 | }
212 |
213 | #pragma mark -----------------------------------解析URL
214 | - (void)analyzeLink
215 | {
216 | NSMutableString *tmpText = [[NSMutableString alloc] initWithString:self.string];
217 |
218 | NSError *regexError = nil;
219 | //正则表达式匹配链接
220 | NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:URLRegex options:0 error:®exError];
221 |
222 | [regex enumerateMatchesInString:tmpText options:0 range:NSMakeRange(0, tmpText.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
223 | NSString *protocol = @"http";
224 | NSString *link = [tmpText substringWithRange:result.range];
225 | NSRange protocolRange = [link rangeOfString:@"://"];
226 | if (protocolRange.location != NSNotFound) {
227 | protocol = [link substringToIndex:protocolRange.location];
228 | }
229 |
230 | if ([_validProtocols containsObject:protocol.lowercaseString]) {
231 | NSMutableDictionary *attributesLink = [[NSMutableDictionary alloc]initWithDictionary:_attributesLink];
232 | [attributesLink setValue:[NSURL URLWithString:link] forKey:NSLinkAttributeName];
233 | [_rangesOfKeyWords addObject:@{KeyWord: @(WBTextKeyWordLink), UrlProtocol: protocol, KeyRange: [NSValue valueWithRange:result.range],UrlAttributes: attributesLink}];
234 | }
235 | }];
236 | }
237 |
238 | #pragma mark -----------------------------------解析表情
239 | - (void)analyzeImage
240 | {
241 | NSMutableString *tmpText = [[NSMutableString alloc] initWithString:self.string];
242 |
243 | NSRegularExpression *exp_emoji =
244 | [[NSRegularExpression alloc] initWithPattern:EmojiRegex
245 | options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators
246 | error:nil];
247 | NSArray *emojis = [exp_emoji matchesInString:tmpText
248 | options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators
249 | range:NSMakeRange(0, tmpText.length)];
250 | NSMutableArray *emojiRanges = [[NSMutableArray alloc]init];
251 | for (NSTextCheckingResult *result in emojis) {
252 | [emojiRanges addObject:NSStringFromRange(result.range)];
253 | }
254 |
255 | for (int i = 0; i < emojiRanges.count; i++) {
256 | NSRange range = NSRangeFromString([emojiRanges objectAtIndex:i]);
257 | NSString *emojiKey = [self.string substringWithRange:range];
258 | NSString *imageName = [_emojiDictionary objectForKey:emojiKey];
259 |
260 | if (imageName) {
261 | NSInteger decrement = emojiKey.length - 1;
262 | NSArray *updateEmojiArray = [emojiRanges subarrayWithRange:NSMakeRange(i + 1, emojiRanges.count - i - 1)];
263 | int index = 0;
264 | for (NSString *updateEmojiRangeStr in updateEmojiArray) {
265 | NSRange updateEmojiRange = NSRangeFromString(updateEmojiRangeStr);
266 | NSRange newEmojiRange = NSMakeRange(updateEmojiRange.location - decrement, updateEmojiRange.length);
267 | [emojiRanges replaceObjectAtIndex:i + 1 + index withObject:NSStringFromRange(newEmojiRange)];
268 | index++;
269 | }
270 |
271 | //取得.的位置
272 | NSRange imageSuffixRange = [imageName rangeOfString:@"."];
273 | NSString *imageSuffixStr = @"";
274 | if (imageSuffixRange.location != NSNotFound) {
275 | imageSuffixStr = [imageName substringFromIndex:imageSuffixRange.location + 1];
276 | }
277 | /*
278 | 如果是GIF并且为不可编辑的情况下,就镶嵌一个透明的图。
279 | 以大部分需求来看,GIF图只是在纯显示的情况下才能显示,如果是编辑状态下,还是只显示静态图就行了。
280 | */
281 | UIImage *image;
282 | if ([imageSuffixStr isEqualToString:@"gif"] && !self.editable) {
283 | image = [UIImage imageNamed:@"transparent"];
284 | }else{
285 | image = [UIImage imageNamed:imageName];
286 | }
287 |
288 | WBTextAttachment *attachment = [[WBTextAttachment alloc] initWithData:nil ofType:nil];
289 | attachment.size = _attributesFont.pointSize;
290 | attachment.image = image;
291 | NSAttributedString *attachmentStr = [NSAttributedString attributedStringWithAttachment:attachment];
292 | [self replaceCharactersInRange:range withAttributedString:attachmentStr];
293 |
294 | NSRange attachmentRange = NSMakeRange(range.location, 1);
295 | NSString *attachmentRangeStr = NSStringFromRange(attachmentRange);
296 | [_attachmentRangeArray addObject:attachmentRangeStr];
297 | [self sortedAttachmentRangeArray];
298 | [_attachmentDictionary setObject:emojiKey forKey:attachmentRangeStr];
299 |
300 | //先排序再处理
301 | [self sortedRangesOfKeyWords];
302 | int updateIndex = 0;
303 | NSMutableArray *updateArray = [[NSMutableArray alloc]init];
304 | for (NSDictionary *dictionary in _rangesOfKeyWords) {
305 | NSRange keyWordsRange = [[dictionary objectForKey:KeyRange] rangeValue];
306 | if (keyWordsRange.location > range.location) {
307 | NSInteger decrement = emojiKey.length;
308 | NSRange updateRange = NSMakeRange(keyWordsRange.location - decrement + 1, keyWordsRange.length);
309 | NSMutableDictionary *updateDic = [[NSMutableDictionary alloc]initWithDictionary:dictionary];
310 | [updateDic setObject:[NSValue valueWithRange:updateRange] forKey:KeyRange];
311 | [updateArray addObject:updateDic];
312 | }else{
313 | updateIndex++;
314 | }
315 | }
316 |
317 | //更新需要更新的对象
318 | [_rangesOfKeyWords removeObjectsInRange:NSMakeRange(updateIndex, _rangesOfKeyWords.count - updateIndex)];
319 | [_rangesOfKeyWords addObjectsFromArray:updateArray];
320 |
321 | }
322 | }
323 | }
324 |
325 | #pragma mark -----------------------------------AttachmentRangeArray排序
326 | - (void)sortedAttachmentRangeArray
327 | {
328 | NSComparator cmptr = ^(id obj1, id obj2){
329 | if (NSRangeFromString(obj1).location > NSRangeFromString(obj2).location) {
330 | return (NSComparisonResult)NSOrderedDescending;
331 | }
332 |
333 | if (NSRangeFromString(obj1).location < NSRangeFromString(obj2).location) {
334 | return (NSComparisonResult)NSOrderedAscending;
335 | }
336 | return (NSComparisonResult)NSOrderedSame;
337 | };
338 | NSArray *sortedArray = [_attachmentRangeArray sortedArrayUsingComparator:cmptr];
339 | [_attachmentRangeArray removeAllObjects];
340 | [_attachmentRangeArray addObjectsFromArray:sortedArray];
341 | }
342 |
343 | #pragma mark -----------------------------------RangesOfKeyWords排序
344 | - (void)sortedRangesOfKeyWords
345 | {
346 | NSComparator cmptr = ^(id obj1, id obj2){
347 | if ([[obj1 objectForKey:KeyRange] rangeValue].location > [[obj2 objectForKey:KeyRange] rangeValue].location) {
348 | return (NSComparisonResult)NSOrderedDescending;
349 | }
350 |
351 | if ([[obj1 objectForKey:KeyRange] rangeValue].location < [[obj2 objectForKey:KeyRange] rangeValue].location) {
352 | return (NSComparisonResult)NSOrderedAscending;
353 | }
354 | return (NSComparisonResult)NSOrderedSame;
355 | };
356 | NSArray *sortedArray = [_rangesOfKeyWords sortedArrayUsingComparator:cmptr];
357 | [_rangesOfKeyWords removeAllObjects];
358 | [_rangesOfKeyWords addObjectsFromArray:sortedArray];
359 | }
360 |
361 | #pragma mark -----------------------------------刷新
362 | - (void)updateText
363 | {
364 | //设置一下普通文本
365 | NSAttributedString *attributedString = [self attributedSubstringFromRange:NSMakeRange(0, self.string.length)];
366 | [attributedString enumerateAttributesInRange:NSMakeRange(0, attributedString.length) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) {
367 | if (![attrs objectForKey:NSAttachmentAttributeName]) {
368 | [self setAttributes:_attributesText range:range];
369 | }
370 | }];
371 |
372 | //设置特殊文本
373 | for (NSDictionary *dictionary in _rangesOfKeyWords) {
374 | NSRange range = [[dictionary objectForKey:KeyRange] rangeValue];
375 | WBTextKeyWord keyWord = (WBTextKeyWord)[[dictionary objectForKey:KeyWord] intValue];
376 |
377 | if (keyWord == WBTextKeyWordLink) {
378 | [self setAttributes:[dictionary objectForKey:UrlAttributes] range:range];
379 | }else{
380 | [self setAttributes:[self attributesForKeyWord:keyWord] range:range];
381 | }
382 | }
383 | }
384 |
385 | #pragma mark -----------------------------------文本属性
386 | - (NSDictionary *)attributesForKeyWord:(WBTextKeyWord)keyWord {
387 | switch (keyWord) {
388 | case WBTextKeyWordAt:
389 | return _attributesAt;
390 | break;
391 | case WBTextKeyWordPound:
392 | return _attributesPound;
393 | break;
394 | default:
395 | return _attributesText;
396 | break;
397 | }
398 | }
399 |
400 | #pragma mark -----------------------------------增加处理
401 | - (void)addInRange:(NSRange)range andText:(NSString *)string
402 | {
403 | NSLog(@"增加的内容:%@",string);
404 | NSLog(@"增加的范围:%@",NSStringFromRange(range));
405 |
406 | //总共增加的字符串长度
407 | NSInteger addLength = string.length;
408 | NSRegularExpression *exp_emoji =
409 | [[NSRegularExpression alloc] initWithPattern:EmojiRegex
410 | options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators
411 | error:nil];
412 | NSArray *emojis = [exp_emoji matchesInString:string
413 | options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators
414 | range:NSMakeRange(0, string.length)];
415 | //如果字符串中有表情,需要换算成表情的长度
416 | for (NSTextCheckingResult *emojiResult in emojis) {
417 | NSRange range = emojiResult.range;
418 | NSString *emojiKey = [string substringWithRange:range];
419 |
420 | addLength = addLength - emojiKey.length + 1;
421 | }
422 | _selectedRangeLocation = 0;
423 | NSLog(@"增加的长度为:%ld",(long)addLength);
424 | _selectedRangeLocation = range.location + addLength;
425 | NSLog(@"光标起始位置为:%ld",(long)_selectedRangeLocation);
426 |
427 | NSLog(@"增加前:");
428 | NSLog(@"数组:%@",_attachmentRangeArray);
429 | NSLog(@"字典:%@",_attachmentDictionary);
430 | NSInteger updateAttributeInArrayIndex = 0;
431 |
432 | for (NSString *updateRangeStr in _attachmentRangeArray) {
433 | NSRange updateRange = NSRangeFromString(updateRangeStr);
434 | if(range.location < updateRange.location || range.location == updateRange.location){
435 | break;
436 | }
437 | updateAttributeInArrayIndex++;
438 | }
439 | NSLog(@"需要修改的对象下标:%li",(long)updateAttributeInArrayIndex);
440 |
441 | //如果为最后一个对象则直接删除,不需要处理
442 | if (updateAttributeInArrayIndex < _attachmentRangeArray.count) {
443 | //取得必须要改变的附件对象的范围
444 | NSRange mustChangeAttributesInArrayRange = NSMakeRange(updateAttributeInArrayIndex, _attachmentRangeArray.count - updateAttributeInArrayIndex);
445 | NSLog(@"需要修改的对象范围:%@",NSStringFromRange(mustChangeAttributesInArrayRange));
446 | //取得必须要改变的附件对象的集合
447 | NSArray *updateAttributesInArray = [_attachmentRangeArray subarrayWithRange:mustChangeAttributesInArrayRange];
448 | NSLog(@"需要修改的对象集合:%@",updateAttributesInArray);
449 | //取得所有对象对应的值集合
450 | NSMutableArray *updateDicValue = [[NSMutableArray alloc]init];
451 | for (NSString *updateRangeStr in _attachmentRangeArray) {
452 | [updateDicValue addObject:[_attachmentDictionary objectForKey:updateRangeStr]];
453 | }
454 | NSLog(@"所有对象对应的值集合:%@",updateAttributesInArray);
455 |
456 | //移除需要改变的对象
457 | [_attachmentRangeArray removeObjectsInArray:updateAttributesInArray];
458 |
459 | //重新增加改变后的对象
460 | for (NSString *updateRangeStr in updateAttributesInArray) {
461 | NSRange updateRange = NSRangeFromString(updateRangeStr);
462 | NSRange newRange = NSMakeRange(updateRange.location + addLength, updateRange.length);
463 | //为数组增加
464 | [_attachmentRangeArray addObject:NSStringFromRange(newRange)];
465 | }
466 |
467 | //重新排列字典
468 | [_attachmentDictionary removeAllObjects];
469 | for (int i = 0; i < _attachmentRangeArray.count; i++) {
470 | [_attachmentDictionary setObject:[updateDicValue objectAtIndex:i] forKey:[_attachmentRangeArray objectAtIndex:i]];
471 | }
472 | }
473 |
474 | NSLog(@"增加后:");
475 | NSLog(@"数组:%@",_attachmentRangeArray);
476 | NSLog(@"字典:%@",_attachmentDictionary);
477 | }
478 |
479 | #pragma mark -----------------------------------删除处理
480 | - (void)removeAttachmentDictionaryInRange:(NSRange)range
481 | {
482 | NSAttributedString *attributedString = [self attributedSubstringFromRange:range];
483 | if ([self isEmoji:[attributedString string]]) {
484 | return;
485 | }
486 | NSMutableArray *removeAttachmentRangeArray = [[NSMutableArray alloc]init];
487 | NSMutableArray *removeTextRangeArray = [[NSMutableArray alloc]init];
488 |
489 | [attributedString enumerateAttributesInRange:NSMakeRange(0, attributedString.length) options:0 usingBlock:^(NSDictionary *attrs, NSRange attributedRange, BOOL *stop) {
490 |
491 | if ([attrs objectForKey:NSAttachmentAttributeName]) {
492 | [removeAttachmentRangeArray addObject:NSStringFromRange(attributedRange)];
493 | }else{
494 | [removeTextRangeArray addObject:NSStringFromRange(attributedRange)];
495 | }
496 | }];
497 |
498 | NSLog(@"删除前:");
499 | NSLog(@"数组:%@",_attachmentRangeArray);
500 | NSLog(@"字典:%@",_attachmentDictionary);
501 |
502 | //附本处理
503 | NSMutableArray *removeAttachmentRanges = [[NSMutableArray alloc]init];
504 |
505 | int i = 0;
506 | for (NSString *removeRangeStr in removeAttachmentRangeArray) {
507 | NSLog(@"附本处理:%@",removeRangeStr);
508 |
509 | NSRange removeRange = NSRangeFromString(removeRangeStr);
510 | //计算出需要移除的附件在全文中的范围
511 | NSRange removeAttachmentRange = NSMakeRange(range.location + removeRange.location, removeRange.length);
512 | [removeAttachmentRanges addObject:NSStringFromRange(removeAttachmentRange)];
513 |
514 | //得到需要更新的附本下标起始位置
515 | NSInteger updateAttributeInArrayIndex = [self moveAttachments:removeAttachmentRange];
516 |
517 | NSString *removeRangeString = [[_attachmentRangeArray subarrayWithRange:NSMakeRange(updateAttributeInArrayIndex - 1, 1)] objectAtIndex:0];
518 | if (_attachmentRangeArray.count == _attachmentDictionary.count) {
519 | [_attachmentDictionary removeObjectForKey:removeRangeString];
520 | }
521 | [_attachmentRangeArray removeObjectsInRange:NSMakeRange(updateAttributeInArrayIndex - 1, 1)];
522 | i++;
523 | }
524 |
525 | NSLog(@"附本处理后:");
526 | NSLog(@"数组:%@",_attachmentRangeArray);
527 | NSLog(@"字典:%@",_attachmentDictionary);
528 |
529 | //普通文字处理
530 | for (NSString *removeRangeStr in removeTextRangeArray) {
531 | NSLog(@"文字处理:%@",removeRangeStr);
532 | NSRange removeRange = NSRangeFromString(removeRangeStr);
533 |
534 | //计算出需要移除的附件在全文中的范围
535 | NSRange removeTextRange = NSMakeRange(range.location + removeRange.location, removeRange.length);
536 |
537 | //移动附本位置
538 | [self moveAttachments:removeTextRange];
539 | }
540 |
541 | NSLog(@"文字处理后:");
542 | NSLog(@"数组:%@",_attachmentRangeArray);
543 | NSLog(@"字典:%@",_attachmentDictionary);
544 | }
545 |
546 | #pragma mark -----------------------------------根据需要删除的对象的位置来移动附本对象在容器中的位置
547 | - (NSInteger)moveAttachments:(NSRange)removeRange
548 | {
549 | NSInteger updateAttributeInArrayIndex = 0;
550 |
551 | for (NSString *updateRangeStr in _attachmentRangeArray) {
552 | NSRange updateRange = NSRangeFromString(updateRangeStr);
553 | if(removeRange.location < updateRange.location){
554 | break;
555 | }
556 | updateAttributeInArrayIndex++;
557 | }
558 |
559 | NSLog(@"需要修改的对象下标:%li",(long)updateAttributeInArrayIndex);
560 |
561 | //如果为最后一个对象则直接删除,不需要处理附本对象
562 | if (updateAttributeInArrayIndex < _attachmentRangeArray.count) {
563 |
564 | //因为移除的附件如果在另外的附件前面,后面的附件的为范围Location也需要更新,所以在这里取得必须要改变的附件对象的范围
565 | NSRange mustChangeAttributesInArrayRange = NSMakeRange(updateAttributeInArrayIndex, _attachmentRangeArray.count - updateAttributeInArrayIndex);
566 |
567 | NSLog(@"需要修改的对象范围:%@",NSStringFromRange(mustChangeAttributesInArrayRange));
568 | //取得必须要改变的附件对象的集合
569 | NSArray *updateAttributesInArray = [_attachmentRangeArray subarrayWithRange:mustChangeAttributesInArrayRange];
570 | NSLog(@"需要修改的对象集合:%@",updateAttributesInArray);
571 |
572 | //移除需要改变的对象
573 | [_attachmentRangeArray removeObjectsInArray:updateAttributesInArray];
574 |
575 | //重新增加改变后的对象
576 | for (NSString *updateRangeStr in updateAttributesInArray) {
577 | NSRange updateRange = NSRangeFromString(updateRangeStr);
578 | NSRange newRange = NSMakeRange(updateRange.location - removeRange.length, updateRange.length);
579 | //为数组增加
580 | [_attachmentRangeArray addObject:NSStringFromRange(newRange)];
581 |
582 | //为字典增加
583 | NSString *attachmentKey = [_attachmentDictionary objectForKey:updateRangeStr];
584 | [_attachmentDictionary removeObjectForKey:updateRangeStr];
585 | [_attachmentDictionary setObject:attachmentKey forKey:NSStringFromRange(newRange)];
586 | }
587 | }
588 | return updateAttributeInArrayIndex;
589 | }
590 |
591 | #pragma mark - 供其他控件使用的方法
592 | #pragma mark -
593 | #pragma mark -----------------------------------是否为表情标示
594 | - (BOOL)isEmoji:(NSString *)text
595 | {
596 | if (text.length == 0) {
597 | return NO;
598 | }
599 |
600 | NSRegularExpression *exp_emoji =
601 | [[NSRegularExpression alloc] initWithPattern:EmojiRegex
602 | options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators
603 | error:nil];
604 |
605 | NSInteger count = [exp_emoji numberOfMatchesInString:text options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators range:NSMakeRange(0, text.length)];
606 |
607 | if (count > 0) {
608 | return YES;
609 | }else{
610 | return NO;
611 | }
612 | }
613 |
614 | #pragma mark -----------------------------------是否为GIF表情
615 | - (NSString *)isGifEmoji:(NSString *)text
616 | {
617 | if (text.length == 0) {
618 | return nil;
619 | }
620 | NSString *imageName = [_emojiDictionary objectForKey:text];
621 |
622 | //取得.的位置
623 | NSRange imageSuffixRange = [imageName rangeOfString:@"."];
624 | NSString *imageSuffixStr = @"";
625 | if (imageSuffixRange.location != NSNotFound) {
626 | imageSuffixStr = [imageName substringFromIndex:imageSuffixRange.location + 1];
627 | }
628 |
629 | if ([imageSuffixStr isEqualToString:@"gif"]) {
630 | return imageName;
631 | }else{
632 | return nil;
633 | }
634 | }
635 |
636 | #pragma mark -----------------------------------重新设置文本大小
637 | - (void)reSetTextAttributesFont
638 | {
639 | _attributesText = @{NSForegroundColorAttributeName: TextColor, NSFontAttributeName: _attributesFont};//普通文本属性
640 | _attributesAt = @{NSForegroundColorAttributeName: AtColor, NSFontAttributeName: _attributesFont};//@文本属性
641 | _attributesPound = @{NSForegroundColorAttributeName: PoundColor, NSFontAttributeName: _attributesFont};//#文本属性
642 | _attributesLink = @{NSFontAttributeName: _attributesFont};//HTTP链接文本属性
643 | }
644 |
645 | #pragma mark -----------------------------------得到纯文本内容
646 | - (NSString *)getPlainText
647 | {
648 | NSMutableString *text = [[NSMutableString alloc]initWithString:[self string]];
649 | NSLog(@"没有还原的纯文本为:%@",text);
650 | NSLog(@"当前附本数组:%@",_attachmentDictionary);
651 | NSLog(@"当前附本字典:%@",_attachmentRangeArray);
652 |
653 | //先排序,防止顺序不对的情况
654 | [self sortedAttachmentRangeArray];
655 |
656 | NSInteger addLength = 0;
657 | for (NSString *attachmentRangeStr in _attachmentRangeArray) {
658 | NSRange attachmentRange = NSRangeFromString(attachmentRangeStr);
659 | NSString *attachmentValue = [_attachmentDictionary objectForKey:attachmentRangeStr];
660 | NSRange newAttachmentRange = NSMakeRange(attachmentRange.location + addLength, attachmentValue.length);
661 | [text insertString:attachmentValue atIndex:newAttachmentRange.location];
662 | addLength += attachmentValue.length;
663 | }
664 |
665 | NSLog(@"还原后的纯文本为:%@",text);
666 | return text;
667 | }
668 |
669 | #pragma mark -----------------------------------得到字符的高度
670 | - (CGFloat)getStringHeightWithSize:(CGSize)size
671 | {
672 | CGSize stringSize = [self.string boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:_attributesText context:nil].size;
673 |
674 | return stringSize.height;
675 | }
676 | @end
677 |
--------------------------------------------------------------------------------
/WBTextKitTools/WBTextView/WBTextView.h:
--------------------------------------------------------------------------------
1 | //
2 | // WBTextView.h
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/11/24.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "WBTextStorage.h"
11 | #import "WBFaceView.h"
12 |
13 | @protocol WBTextDelegate
14 | @optional
15 | - (void)WBTextViewDidDeleteFace;
16 | @end
17 |
18 | @interface WBTextView : UITextView
19 |
20 | @property (nonatomic, copy) void (^detectionBlock)(WBTextKeyWord keyWord, NSString *string, NSString *protocol, NSRange range);
21 | @property (nonatomic, weak) id wbDelegate;
22 |
23 | - (CGFloat)getHeight;
24 | @end
25 |
--------------------------------------------------------------------------------
/WBTextKitTools/WBTextView/WBTextView.m:
--------------------------------------------------------------------------------
1 | //
2 | // WBTextView.m
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/11/24.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import "WBTextView.h"
10 | #import "YLGIFImage.h"
11 | #import "YLImageView.h"
12 | #import "WBFaceView.h"
13 |
14 | @implementation WBTextView{
15 | WBTextStorage *_wbTextStorage;
16 | NSLayoutManager *_wbLayoutManager;
17 | NSTextContainer *_wbTextContainer;
18 | NSMutableString *_copyStr;
19 | NSMutableArray *_gifs;
20 | }
21 |
22 | #pragma mark - 初始化方法
23 | #pragma mark -
24 | #pragma mark -----------------------------------初始化
25 | - (instancetype)initWithFrame:(CGRect)frame textContainer:(NSTextContainer *)textContainer
26 | {
27 | //文本存储,用来存放String
28 | _wbTextStorage = [[WBTextStorage alloc]init];
29 |
30 | //布局管理器
31 | _wbLayoutManager = [NSLayoutManager new];
32 | [_wbTextStorage addLayoutManager:_wbLayoutManager];
33 |
34 | //文本容器
35 | _wbTextContainer = [[NSTextContainer alloc]initWithSize:CGSizeMake(frame.size.width, frame.size.height)];
36 | [_wbLayoutManager addTextContainer:_wbTextContainer];
37 |
38 | _wbTextStorage.layouManager = _wbLayoutManager;
39 | _wbTextStorage.textContainer = _wbTextContainer;
40 | self = [super initWithFrame:frame textContainer:_wbTextContainer];
41 |
42 | _copyStr = [[NSMutableString alloc]init];
43 | _gifs = [[NSMutableArray alloc]init];
44 |
45 | if (self) {
46 | [self setup];
47 | }
48 |
49 | return self;
50 | }
51 |
52 | #pragma mark -----------------------------------属性调整
53 | - (void)setup
54 | {
55 | self.editable = YES;
56 | self.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
57 | self.backgroundColor = [UIColor clearColor];
58 | self.textContainer.lineFragmentPadding = 0;
59 | self.textContainerInset = UIEdgeInsetsZero;
60 |
61 | [self addNotification];
62 | }
63 |
64 | #pragma mark - 方法
65 | #pragma mark -
66 | #pragma mark -----------------------------------属性调整
67 | - (CGFloat)getHeight
68 | {
69 | CGSize size = CGSizeMake(self.frame.size.width, 10000);
70 | CGFloat height = [_wbTextStorage getStringHeightWithSize:size];
71 |
72 | return height;
73 | }
74 |
75 | #pragma mark **************************************************************************************************************************
76 | #pragma mark -----------------------------------通知相关-----------------------------------
77 | #pragma mark **************************************************************************************************************************
78 | #pragma mark -----------------------------------增加通知
79 | - (void)addNotification
80 | {
81 | [[NSNotificationCenter defaultCenter] addObserver:self
82 | selector:@selector(keyboardWillChangeFrame:)
83 | name:UIKeyboardWillChangeFrameNotification
84 | object:nil];
85 |
86 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didProcessEditingNotification:) name:DidProcessEditingNotification object:nil];
87 | }
88 |
89 | #pragma mark -----------------------------------键盘位置大小改变事件
90 | - (void)keyboardWillChangeFrame:(NSNotification *)notification
91 | {
92 | NSLog(@"%@",notification.userInfo);
93 | }
94 |
95 | #pragma mark -----------------------------------ProcessEditing结束,检查GIF
96 | - (void)didProcessEditingNotification:(NSNotification *)notification
97 | {
98 | if (!self.editable) {
99 | //需要把之前加载视图上的GIF全部移除掉
100 | for (YLImageView *gifImageView in _gifs) {
101 | [gifImageView removeFromSuperview];
102 | }
103 | //清空数组
104 | [_gifs removeAllObjects];
105 |
106 | //开始加入GIF
107 | for (NSString *rangeStr in _wbTextStorage.attachmentDictionary.allKeys) {
108 | NSString *value = [_wbTextStorage.attachmentDictionary objectForKey:rangeStr];
109 | NSString *gifName = [_wbTextStorage isGifEmoji:value];
110 |
111 | if (gifName) {
112 | /*
113 | GIF存在效率问题,GIF多的情况下会存在卡顿的现象。
114 | */
115 | YLImageView *gifImageView = [[YLImageView alloc]initWithFrame:CGRectZero];
116 | CGRect gifImageRect = [_wbLayoutManager boundingRectForGlyphRange:NSRangeFromString(rangeStr) inTextContainer:_wbTextContainer];
117 | gifImageRect.size.height = gifImageRect.size.width;
118 | gifImageView.frame = gifImageRect;
119 | gifImageView.image = [YLGIFImage imageNamed:gifName];;
120 | [self addSubview:gifImageView];
121 |
122 | [_gifs addObject:gifImageView];
123 | }
124 | }
125 | }
126 | }
127 |
128 | #pragma mark -----------------------------------移除通知
129 | - (void)removeNotification
130 | {
131 | [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillChangeFrameNotification object:nil];
132 | [[NSNotificationCenter defaultCenter] removeObserver:self name:DidProcessEditingNotification object:nil];
133 | }
134 |
135 | #pragma mark - 重写一些方法
136 | #pragma mark -
137 | #pragma mark -----------------------------------重写设置编辑状态
138 | - (void)setEditable:(BOOL)editable
139 | {
140 | [super setEditable:editable];
141 | [_wbTextStorage setEditable:editable];
142 | }
143 |
144 | #pragma mark -----------------------------------重写获得文本的方法
145 | - (NSString *)text
146 | {
147 | NSString *text = [_wbTextStorage getPlainText];
148 | return text;
149 | }
150 |
151 | #pragma mark -----------------------------------重写文字大小的方法
152 | - (void)setFont:(UIFont *)font
153 | {
154 | [super setFont:font];
155 | _wbTextStorage.font = font;
156 | }
157 |
158 | #pragma mark -----------------------------------重写detectionBlock设置方法
159 | - (void)setDetectionBlock:(void (^)(WBTextKeyWord, NSString *, NSString *, NSRange))detectionBlock
160 | {
161 | if (detectionBlock) {
162 | _detectionBlock = [detectionBlock copy];
163 | self.userInteractionEnabled = YES;
164 | } else {
165 | _detectionBlock = nil;
166 | self.userInteractionEnabled = NO;
167 | }
168 | }
169 |
170 | #pragma mark -----------------------------------重写插入方法
171 | - (void)insertText:(NSString *)text
172 | {
173 | NSMutableString *inserStr = [[NSMutableString alloc]initWithString:text];
174 |
175 | //如果是在URL链接后面插入表情,需要加入一个空格隔开,不然会发生某些异常
176 | for (NSDictionary *dictionary in _wbTextStorage.rangesOfKeyWords) {
177 | NSRange range = [[dictionary objectForKey:KeyRange] rangeValue];
178 | NSInteger insertLocation = NSMaxRange(range);
179 | WBTextKeyWord keyWord = (WBTextKeyWord)[[dictionary objectForKey:KeyWord] intValue];
180 |
181 | if (keyWord == WBTextKeyWordLink && insertLocation == self.selectedRange.location && [_wbTextStorage isEmoji:text] ) {
182 | [inserStr insertString:@" " atIndex:0];
183 | }
184 | }
185 |
186 | [super insertText:inserStr];
187 | //由于在插入表情时,光标位置异常,需要手动调整
188 | [self setSelectedRange:NSMakeRange(_wbTextStorage.selectedRangeLocation, 0)];
189 | }
190 |
191 | #pragma mark - 委托响应
192 | #pragma mark -
193 | #pragma mark -----------------------------------插入表情
194 | - (void)insertFaceWithKey:(NSString *)faceKey
195 | {
196 | [self insertText:faceKey];
197 | }
198 |
199 | #pragma mark -----------------------------------删除表情
200 | - (void)deleteFace
201 | {
202 | [_wbTextStorage replaceCharactersInRange:NSMakeRange(self.selectedRange.location - 1, 1) withString:@""];
203 | if ([_wbDelegate respondsToSelector:@selector(WBTextViewDidDeleteFace)]) {
204 | [_wbDelegate WBTextViewDidDeleteFace];
205 | }
206 | }
207 |
208 | #pragma mark - 点击特殊字符响应
209 | #pragma mark -
210 | #pragma mark -----------------------------------点击开始
211 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
212 | if (self.editable) {
213 | return;
214 | }
215 |
216 | id touchedKeyWord = [self getTouchedKeyWord:touches];
217 | WBTextKeyWord keyWord = (WBTextKeyWord)[[touchedKeyWord objectForKey:KeyWord] intValue];
218 | if(touchedKeyWord == nil || keyWord == WBTextKeyWordLink) {
219 | [super touchesBegan:touches withEvent:event];
220 | }
221 | }
222 |
223 | #pragma mark -----------------------------------点击结束
224 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
225 | CGPoint touchLocation = [[touches anyObject] locationInView:self];
226 |
227 | CGRect myRect = self.frame;
228 | myRect.origin.x = 0;
229 | myRect.origin.y = 0;
230 |
231 | if (!CGRectContainsPoint(myRect, touchLocation))
232 | return;
233 |
234 | id touchedKeyWord = [self getTouchedKeyWord:touches];
235 | WBTextKeyWord keyWord = (WBTextKeyWord)[[touchedKeyWord objectForKey:KeyWord] intValue];
236 | if(touchedKeyWord != nil && keyWord != WBTextKeyWordLink) {
237 | NSRange range = [[touchedKeyWord objectForKey:KeyRange] rangeValue];
238 |
239 | _detectionBlock((WBTextKeyWord)[[touchedKeyWord objectForKey:KeyWord] intValue], [[_wbTextStorage string] substringWithRange:range], [touchedKeyWord objectForKey:UrlProtocol], range);
240 | } else {
241 | [super touchesEnded:touches withEvent:event];
242 | }
243 | }
244 |
245 | #pragma mark -----------------------------------找到字符在文本中的位置
246 | - (NSUInteger)charIndexAtLocation:(CGPoint)touchLocation {
247 | NSUInteger glyphIndex = [_wbLayoutManager glyphIndexForPoint:touchLocation inTextContainer:_wbTextContainer];
248 | CGRect boundingRect = [_wbLayoutManager boundingRectForGlyphRange:NSMakeRange(glyphIndex, 1) inTextContainer:_wbTextContainer];
249 |
250 | if (CGRectContainsPoint(boundingRect, touchLocation))
251 | return [_wbLayoutManager characterIndexForGlyphAtIndex:glyphIndex];
252 | else
253 | return -1;
254 | }
255 |
256 | #pragma mark -----------------------------------从存储关键字的数组中取出对象
257 | - (id)getTouchedKeyWord:(NSSet *)touches {
258 | NSUInteger charIndex = [self charIndexAtLocation:[[touches anyObject] locationInView:self]];
259 |
260 | for (id obj in _wbTextStorage.rangesOfKeyWords) {
261 | NSRange range = [[obj objectForKey:KeyRange] rangeValue];
262 |
263 | if (charIndex >= range.location && charIndex < range.location + range.length) {
264 | return obj;
265 | }
266 | }
267 |
268 | return nil;
269 | }
270 |
271 | #pragma mark - 复制粘贴
272 | #pragma mark -
273 | #pragma mark -----------------------------------获得第一响应
274 | - (BOOL)canBecomeFirstResponder
275 | {
276 | return YES;
277 | }
278 |
279 | #pragma mark -----------------------------------弹出菜单支持哪些操作
280 | - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
281 | {
282 | if (action==@selector(copy:)) {
283 | return YES;
284 | }else if(action == @selector(select:)){
285 | return YES;
286 | }else if(action == @selector(selectAll:)){
287 | return YES;
288 | }else if(action == @selector(paste:)){
289 | if (self.editable) {
290 | return YES;
291 | }else{
292 | return NO;
293 | }
294 | }else{
295 | return NO;
296 | }
297 |
298 | return [super canPerformAction:action withSender:sender];
299 | }
300 |
301 | #pragma mark -----------------------------------重写复制方法
302 | - (void)copy:(id)sender
303 | {
304 | [self copyToPasteboard];
305 | }
306 |
307 | #pragma mark -----------------------------------复制内容到粘贴板
308 | /*
309 | 普通复制时,附本类是复制不了的;
310 | 此方法用于对表情(附本)的复制;
311 | 比较重要的系统调用都是使用的NSAttributedStringSDK中的方法;
312 | */
313 | - (void)copyToPasteboard
314 | {
315 | NSLog(@"%@",_wbTextStorage.attachmentRangeArray);
316 | NSLog(@"%@",NSStringFromRange(self.selectedRange));
317 |
318 | NSMutableArray *textArray = [[NSMutableArray alloc]init];
319 | //获得被选取部分的属性字符串
320 | NSMutableAttributedString *selectedAttributedString = [[NSMutableAttributedString alloc]initWithAttributedString:[_wbTextStorage attributedSubstringFromRange:self.selectedRange]];
321 |
322 | [selectedAttributedString enumerateAttributesInRange:NSMakeRange(0, selectedAttributedString.length) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) {
323 | //从选取的属性字符串中分别找到文字部分的范围
324 | [textArray addObject:NSStringFromRange(range)];
325 | }];
326 |
327 | //生成文字部分的字典,记录每个范围内的文字
328 | NSMutableDictionary *textDictionary = [[NSMutableDictionary alloc]init];
329 | for (NSString *textRangeStr in textArray) {
330 | NSRange textRange = NSRangeFromString(textRangeStr);
331 | NSAttributedString *textAttributedString = [selectedAttributedString attributedSubstringFromRange:textRange];
332 | [textAttributedString enumerateAttributesInRange:NSMakeRange(0, textAttributedString.length) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) {
333 | if ([attrs objectForKey:NSAttachmentAttributeName]) {
334 | [textDictionary setObject:NSAttachmentAttributeName forKey:textRangeStr];
335 | }else{
336 | NSString *textStr = [textAttributedString string];
337 | [textDictionary setObject:textStr forKey:textRangeStr];
338 | }
339 | }];
340 | }
341 | NSLog(@"%@",textDictionary);
342 |
343 | [_copyStr setString:@""];
344 |
345 | //以下为区分复制的表情(附本)和普通文字的核心循环
346 | for (NSString *textRangeStr in textArray) {
347 | NSString *text = [textDictionary objectForKey:textRangeStr];
348 | if (text != NSAttachmentAttributeName) {
349 | [_copyStr appendString:text];
350 | }else{
351 | for (NSString *attachmentRangeStr in _wbTextStorage.attachmentRangeArray) {
352 | NSRange attachmentRange = NSRangeFromString(attachmentRangeStr);
353 | NSRange textRange = NSRangeFromString(textRangeStr);
354 | NSInteger copyAttachmentLocation = self.selectedRange.location + textRange.location;
355 |
356 | if(NSLocationInRange(attachmentRange.location, self.selectedRange) && copyAttachmentLocation == attachmentRange.location){
357 | NSString *emojiKey = [_wbTextStorage.attachmentDictionary objectForKey:attachmentRangeStr];
358 | [_copyStr appendString:emojiKey];
359 | break;
360 | }
361 | }
362 | }
363 | }
364 | NSLog(@"%@",_copyStr);
365 |
366 | //复制到剪贴板
367 | UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
368 | pasteboard.string = _copyStr;
369 | }
370 |
371 | #pragma mark -----------------------------------重写粘贴方法
372 | - (void)paste:(id)sender
373 | {
374 | [super paste:sender];
375 | //由于在插入表情时,光标位置异常,需要手动调整
376 | [self setSelectedRange:NSMakeRange(_wbTextStorage.selectedRangeLocation, 0)];
377 | }
378 |
379 |
380 | @end
381 |
--------------------------------------------------------------------------------
/WBTextKitTools/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // WBTextKitTools
4 | //
5 | // Created by mc on 14/11/20.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "AppDelegate.h"
11 |
12 | int main(int argc, char * argv[]) {
13 | @autoreleasepool {
14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/WBTextKitToolsTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | com.wb.app.ios.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/WBTextKitToolsTests/WBTextKitToolsTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // WBTextKitToolsTests.m
3 | // WBTextKitToolsTests
4 | //
5 | // Created by mc on 14/11/20.
6 | // Copyright (c) 2014年 WB. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface WBTextKitToolsTests : XCTestCase
13 |
14 | @end
15 |
16 | @implementation WBTextKitToolsTests
17 |
18 | - (void)setUp {
19 | [super setUp];
20 | // Put setup code here. This method is called before the invocation of each test method in the class.
21 | }
22 |
23 | - (void)tearDown {
24 | // Put teardown code here. This method is called after the invocation of each test method in the class.
25 | [super tearDown];
26 | }
27 |
28 | - (void)testExample {
29 | // This is an example of a functional test case.
30 | XCTAssert(YES, @"Pass");
31 | }
32 |
33 | - (void)testPerformanceExample {
34 | // This is an example of a performance test case.
35 | [self measureBlock:^{
36 | // Put the code you want to measure the time of here.
37 | }];
38 | }
39 |
40 | @end
41 |
--------------------------------------------------------------------------------