├── .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 | --------------------------------------------------------------------------------