├── .gitignore ├── KeyBoard ├── KeyBoard.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── KeyBoard │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ └── img_defaulthead_nor.imageset │ │ ├── Contents.json │ │ ├── img_defaulthead_nor.png │ │ ├── img_defaulthead_nor@2x.png │ │ └── img_defaulthead_nor@3x.png │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ ├── KeyBoard │ ├── Class │ │ ├── CollectionViewFlowLayout.h │ │ ├── CollectionViewFlowLayout.m │ │ ├── EmojiButtonView.h │ │ ├── EmojiButtonView.m │ │ ├── EmojiCollectionViewCell.h │ │ ├── EmojiCollectionViewCell.m │ │ ├── EmotionImages.h │ │ ├── EmotionImages.m │ │ ├── IMEmotionEntity.h │ │ ├── IMEmotionEntity.m │ │ ├── InputToolbar.h │ │ ├── InputToolbar.m │ │ ├── MoreButtonView.h │ │ ├── MoreButtonView.m │ │ ├── UITextView+Category.h │ │ ├── UITextView+Category.m │ │ ├── UIView+Extension.h │ │ ├── UIView+Extension.m │ │ ├── VoiceButtonView.h │ │ └── VoiceButtonView.m │ └── KerboardResource │ │ ├── Emoji.plist │ │ ├── emotion │ │ ├── DeleteEmoticonBtn@2x.png │ │ ├── DeleteEmoticonBtnHL@2x.png │ │ ├── Expression_100@2x.png │ │ ├── Expression_101@2x.png │ │ ├── Expression_102@2x.png │ │ ├── Expression_103@2x.png │ │ ├── Expression_104@2x.png │ │ ├── Expression_105@2x.png │ │ ├── Expression_10@2x.png │ │ ├── Expression_11@2x.png │ │ ├── Expression_12@2x.png │ │ ├── Expression_13@2x.png │ │ ├── Expression_14@2x.png │ │ ├── Expression_15@2x.png │ │ ├── Expression_16@2x.png │ │ ├── Expression_17@2x.png │ │ ├── Expression_18@2x.png │ │ ├── Expression_19@2x.png │ │ ├── Expression_1@2x.png │ │ ├── Expression_20@2x.png │ │ ├── Expression_21@2x.png │ │ ├── Expression_22@2x.png │ │ ├── Expression_23@2x.png │ │ ├── Expression_24@2x.png │ │ ├── Expression_25@2x.png │ │ ├── Expression_26@2x.png │ │ ├── Expression_27@2x.png │ │ ├── Expression_28@2x.png │ │ ├── Expression_29@2x.png │ │ ├── Expression_2@2x.png │ │ ├── Expression_30@2x.png │ │ ├── Expression_31@2x.png │ │ ├── Expression_32@2x.png │ │ ├── Expression_33@2x.png │ │ ├── Expression_34@2x.png │ │ ├── Expression_35@2x.png │ │ ├── Expression_36@2x.png │ │ ├── Expression_37@2x.png │ │ ├── Expression_38@2x.png │ │ ├── Expression_39@2x.png │ │ ├── Expression_3@2x.png │ │ ├── Expression_40@2x.png │ │ ├── Expression_41@2x.png │ │ ├── Expression_42@2x.png │ │ ├── Expression_43@2x.png │ │ ├── Expression_44@2x.png │ │ ├── Expression_45@2x.png │ │ ├── Expression_46@2x.png │ │ ├── Expression_47@2x.png │ │ ├── Expression_48@2x.png │ │ ├── Expression_49@2x.png │ │ ├── Expression_4@2x.png │ │ ├── Expression_50@2x.png │ │ ├── Expression_51@2x.png │ │ ├── Expression_52@2x.png │ │ ├── Expression_53@2x.png │ │ ├── Expression_54@2x.png │ │ ├── Expression_55@2x.png │ │ ├── Expression_56@2x.png │ │ ├── Expression_57@2x.png │ │ ├── Expression_58@2x.png │ │ ├── Expression_59@2x.png │ │ ├── Expression_5@2x.png │ │ ├── Expression_60@2x.png │ │ ├── Expression_61@2x.png │ │ ├── Expression_62@2x.png │ │ ├── Expression_63@2x.png │ │ ├── Expression_64@2x.png │ │ ├── Expression_65@2x.png │ │ ├── Expression_66@2x.png │ │ ├── Expression_67@2x.png │ │ ├── Expression_68@2x.png │ │ ├── Expression_69@2x.png │ │ ├── Expression_6@2x.png │ │ ├── Expression_70@2x.png │ │ ├── Expression_71@2x.png │ │ ├── Expression_72@2x.png │ │ ├── Expression_73@2x.png │ │ ├── Expression_74@2x.png │ │ ├── Expression_75@2x.png │ │ ├── Expression_76@2x.png │ │ ├── Expression_77@2x.png │ │ ├── Expression_78@2x.png │ │ ├── Expression_79@2x.png │ │ ├── Expression_7@2x.png │ │ ├── Expression_80@2x.png │ │ ├── Expression_81@2x.png │ │ ├── Expression_82@2x.png │ │ ├── Expression_83@2x.png │ │ ├── Expression_84@2x.png │ │ ├── Expression_85@2x.png │ │ ├── Expression_86@2x.png │ │ ├── Expression_87@2x.png │ │ ├── Expression_88@2x.png │ │ ├── Expression_89@2x.png │ │ ├── Expression_8@2x.png │ │ ├── Expression_90@2x.png │ │ ├── Expression_91@2x.png │ │ ├── Expression_92@2x.png │ │ ├── Expression_93@2x.png │ │ ├── Expression_94@2x.png │ │ ├── Expression_95@2x.png │ │ ├── Expression_96@2x.png │ │ ├── Expression_97@2x.png │ │ ├── Expression_98@2x.png │ │ ├── Expression_99@2x.png │ │ ├── Expression_9@2x.png │ │ └── emotion_icons.plist │ │ ├── img_defaulthead_nor.png │ │ ├── img_defaulthead_nor@2x.png │ │ ├── img_defaulthead_nor@3x.png │ │ ├── liaotian_ic_biaoqing_nor.png │ │ ├── liaotian_ic_biaoqing_nor@2x.png │ │ ├── liaotian_ic_biaoqing_nor@3x.png │ │ ├── liaotian_ic_biaoqing_press.png │ │ ├── liaotian_ic_biaoqing_press@2x.png │ │ ├── liaotian_ic_biaoqing_press@3x.png │ │ ├── liaotian_ic_gengduo_nor.png │ │ ├── liaotian_ic_gengduo_nor@2x.png │ │ ├── liaotian_ic_gengduo_nor@3x.png │ │ ├── liaotian_ic_gengduo_press.png │ │ ├── liaotian_ic_gengduo_press@2x.png │ │ ├── liaotian_ic_gengduo_press@3x.png │ │ ├── liaotian_ic_jianpan_nor.png │ │ ├── liaotian_ic_jianpan_nor@2x.png │ │ ├── liaotian_ic_jianpan_nor@3x.png │ │ ├── liaotian_ic_jianpan_press.png │ │ ├── liaotian_ic_jianpan_press@2x.png │ │ ├── liaotian_ic_jianpan_press@3x.png │ │ ├── liaotian_ic_press.png │ │ ├── liaotian_ic_press@2x.png │ │ ├── liaotian_ic_press@3x.png │ │ ├── liaotian_ic_yuyin_nor.png │ │ ├── liaotian_ic_yuyin_nor@2x.png │ │ ├── liaotian_ic_yuyin_nor@3x.png │ │ └── mianView.png │ ├── PushViewController.h │ ├── PushViewController.m │ ├── ViewController.h │ ├── ViewController.m │ └── main.m ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xcuserstate 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | *.dSYM 29 | 30 | # CocoaPods 31 | # 32 | # We recommend against adding the Pods directory to your .gitignore. However 33 | # you should judge for yourself, the pros and cons are mentioned at: 34 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 35 | # 36 | # Pods/ 37 | 38 | # Carthage 39 | # 40 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 41 | # Carthage/Checkouts 42 | 43 | Carthage/Build 44 | 45 | # fastlane 46 | # 47 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 48 | # screenshots whenever they are needed. 49 | # For more information about the recommended setup visit: 50 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 51 | 52 | fastlane/report.xml 53 | fastlane/screenshots 54 | 55 | #Code Injection 56 | # 57 | # After new code Injection tools there's a generated folder /iOSInjectionProject 58 | # https://github.com/johnno1962/injectionforxcode 59 | 60 | iOSInjectionProject/ 61 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/17. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | 17 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/17. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // 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. 25 | // 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. 26 | } 27 | 28 | - (void)applicationDidEnterBackground:(UIApplication *)application { 29 | // 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. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // 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. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application { 38 | // 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. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application { 42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/Assets.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 | } -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/Assets.xcassets/img_defaulthead_nor.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "img_defaulthead_nor.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "img_defaulthead_nor@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "img_defaulthead_nor@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/Assets.xcassets/img_defaulthead_nor.imageset/img_defaulthead_nor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/Assets.xcassets/img_defaulthead_nor.imageset/img_defaulthead_nor.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/Assets.xcassets/img_defaulthead_nor.imageset/img_defaulthead_nor@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/Assets.xcassets/img_defaulthead_nor.imageset/img_defaulthead_nor@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/Assets.xcassets/img_defaulthead_nor.imageset/img_defaulthead_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/Assets.xcassets/img_defaulthead_nor.imageset/img_defaulthead_nor@3x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 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 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 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 | 26 | 27 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 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 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSCameraUsageDescription 6 | YES 7 | LSApplicationCategoryType 8 | 9 | NSPhotoLibraryUsageDescription 10 | YES 11 | CFBundleDevelopmentRegion 12 | en 13 | CFBundleExecutable 14 | $(EXECUTABLE_NAME) 15 | CFBundleIdentifier 16 | $(PRODUCT_BUNDLE_IDENTIFIER) 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleName 20 | $(PRODUCT_NAME) 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | 1.0 25 | CFBundleSignature 26 | ???? 27 | CFBundleVersion 28 | 1 29 | LSRequiresIPhoneOS 30 | 31 | UILaunchStoryboardName 32 | LaunchScreen 33 | UIMainStoryboardFile 34 | Main 35 | UIRequiredDeviceCapabilities 36 | 37 | armv7 38 | 39 | UISupportedInterfaceOrientations 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationLandscapeLeft 43 | UIInterfaceOrientationLandscapeRight 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/CollectionViewFlowLayout.h: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionViewFlowLayout.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/19. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CollectionViewFlowLayout : UICollectionViewFlowLayout 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/CollectionViewFlowLayout.m: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionViewFlowLayout.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/19. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import "CollectionViewFlowLayout.h" 10 | 11 | @implementation CollectionViewFlowLayout 12 | 13 | - (void)prepareLayout { 14 | 15 | [super prepareLayout]; 16 | CGFloat W = (self.collectionView.bounds.size.width) / 7; 17 | CGFloat H = (self.collectionView.bounds.size.height) / 3; 18 | 19 | self.itemSize = CGSizeMake(W, H); 20 | self.minimumLineSpacing = 0; 21 | self.minimumInteritemSpacing = 0; 22 | self.scrollDirection = UICollectionViewScrollDirectionHorizontal; 23 | 24 | self.collectionView.pagingEnabled = YES; 25 | self.collectionView.bounces = YES; 26 | self.collectionView.showsHorizontalScrollIndicator = NO; 27 | 28 | CGFloat Y = (self.collectionView.bounds.size.height - 3 * H); 29 | self.collectionView.contentInset = UIEdgeInsetsMake(Y, 0, 0, 0); 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/EmojiButtonView.h: -------------------------------------------------------------------------------- 1 | // 2 | // EmojiButtonView.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "EmojiCollectionViewCell.h" 11 | @class EmojiButtonView; 12 | @protocol EmojiButtonViewDelegate 13 | - (void)emojiButtonView:(EmojiButtonView *)emojiButtonView emojiText:(NSObject *)text; 14 | - (void)emojiButtonView:(EmojiButtonView *)emojiButtonView sendButtonClick:(UIButton *)sender; 15 | @end 16 | 17 | @interface EmojiButtonView : UIView 18 | @property(nonatomic,weak) iddelegate; 19 | @end 20 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/EmojiButtonView.m: -------------------------------------------------------------------------------- 1 | // 2 | // EmojiButtonView.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width 9 | #define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height 10 | #define EMOJI_CODE_TO_SYMBOL(x) ((((0x808080F0 | (x & 0x3F000) >> 4) | (x & 0xFC0) << 10) | (x & 0x1C0000) << 18) | (x & 0x3F) << 24); 11 | 12 | #import "EmojiButtonView.h" 13 | #import "CollectionViewFlowLayout.h" 14 | #import "EmojiCollectionViewCell.h" 15 | #import "UIView+Extension.h" 16 | #import "EmotionImages.h" 17 | 18 | @interface EmojiButtonView () 19 | @property (nonatomic,strong)UIView *emojiFooterView; 20 | @property (nonatomic,strong)UIScrollView *emojiFooterScrollView; 21 | @property (nonatomic,strong)UIPageControl *pageControl; 22 | @property (nonatomic,strong)UICollectionView *collectionView; 23 | @property (nonatomic,strong)UIButton *sendButton; 24 | @property (nonatomic,strong)UIButton *emojiButotn; 25 | @property (nonatomic,strong)UIButton *emojiImageButotn; 26 | @property (nonatomic,strong)CollectionViewFlowLayout *layout; 27 | @property (nonatomic,strong)NSMutableArray *defaultEmoticons; 28 | @property (nonatomic,strong)NSArray *emoticonImages; 29 | @property (nonatomic,strong)NSArray *emoticonImagesString; 30 | @end 31 | 32 | @implementation EmojiButtonView 33 | 34 | - (instancetype)initWithFrame:(CGRect)frame 35 | { 36 | if (self = [super initWithFrame:frame]) { 37 | 38 | _defaultEmoticons = [NSMutableArray array]; 39 | _emoticonImages = [NSMutableArray array]; 40 | [[EmotionImages shareEmotinImages] initEmotionImages]; 41 | _emoticonImages = [EmotionImages shareEmotinImages].images; 42 | _emoticonImagesString = [NSMutableArray array]; 43 | 44 | for (int i=0x1F600; i<=0x1F64F; i++) { 45 | if (i < 0x1F641 || i > 0x1F640) { 46 | int sym = EMOJI_CODE_TO_SYMBOL(i); 47 | NSString *emoT = [[NSString alloc] initWithBytes:&sym length:sizeof(sym) encoding:NSUTF8StringEncoding]; 48 | [_defaultEmoticons addObject:emoT]; 49 | } 50 | } 51 | 52 | _emoticonImagesString = [_defaultEmoticons arrayByAddingObjectsFromArray:[EmotionImages shareEmotinImages].emotions]; 53 | [_defaultEmoticons addObjectsFromArray:[EmotionImages shareEmotinImages].images]; 54 | 55 | for (NSInteger i = 0;i < _defaultEmoticons.count;i ++) { 56 | if (i == 20 || i == 41 || i == 62 || i == 83 || i == 104 || i == 125 || i == 146 || i == 167) { 57 | [_defaultEmoticons insertObject:deleteButtonId atIndex:i]; 58 | } 59 | } 60 | if (self.defaultEmoticons.count % 21 != 0) { 61 | for (NSInteger i = self.defaultEmoticons.count; i < self.defaultEmoticons.count + 21; i ++) { 62 | [self.defaultEmoticons addObject:@""]; 63 | if (self.defaultEmoticons.count % 21 == 0) { 64 | break; 65 | } 66 | } 67 | } 68 | [self.defaultEmoticons replaceObjectAtIndex:self.defaultEmoticons.count - 1 withObject:deleteButtonId]; 69 | self.backgroundColor = [UIColor colorWithRed:243 / 255.0 green:243 / 255.0 blue:243 / 255.0 alpha:1]; 70 | [self layoutUI]; 71 | } 72 | return self; 73 | } 74 | 75 | - (void)layoutUI 76 | { 77 | self.emojiFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 160, SCREEN_WIDTH, 40)]; 78 | self.emojiFooterView.backgroundColor = [UIColor whiteColor]; 79 | [self addSubview:self.emojiFooterView]; 80 | UILabel *line = [[UILabel alloc] initWithFrame:CGRectMake(0, 160, SCREEN_WIDTH, 0.5)]; 81 | line.backgroundColor = [UIColor lightGrayColor]; 82 | [self addSubview:line]; 83 | 84 | self.sendButton = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH / 5 * 4, 0, SCREEN_WIDTH / 5, 40)]; 85 | [self.sendButton setTitle:@"发送" forState:UIControlStateNormal]; 86 | self.sendButton.backgroundColor = [UIColor colorWithRed:230 / 255.0 green:230 / 255.0 blue:230 / 255.0 alpha:1]; 87 | self.sendButton.titleLabel.font = [UIFont systemFontOfSize:15]; 88 | [self.sendButton setTitleColor:[UIColor darkTextColor] forState:UIControlStateNormal]; 89 | [self.sendButton addTarget:self action:@selector(clickSenderButton:) forControlEvents:UIControlEventTouchUpInside]; 90 | [self.emojiFooterView addSubview:self.sendButton]; 91 | 92 | self.emojiFooterScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH - (SCREEN_WIDTH / 5) - 1, self.emojiFooterView.height)]; 93 | self.emojiFooterScrollView.showsHorizontalScrollIndicator = NO; 94 | self.emojiFooterScrollView.showsVerticalScrollIndicator = NO; 95 | self.emojiFooterScrollView.contentSize = CGSizeMake(SCREEN_WIDTH - (SCREEN_WIDTH / 5), self.emojiFooterView.height); 96 | [self.emojiFooterView addSubview:self.emojiFooterScrollView]; 97 | 98 | self.emojiButotn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH / 6, 40)]; 99 | [self.emojiButotn setImage:[UIImage imageNamed:@"liaotian_ic_biaoqing_nor"] forState:UIControlStateNormal]; 100 | [self.emojiButotn setImage:[UIImage imageNamed:@"liaotian_ic_biaoqing_press"] forState:UIControlStateSelected]; 101 | [self.emojiButotn addTarget:self action:@selector(clickEmojiButton) forControlEvents:UIControlEventTouchUpInside]; 102 | [self.emojiFooterScrollView addSubview:self.emojiButotn]; 103 | self.emojiButotn.selected = YES; 104 | 105 | self.emojiImageButotn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH / 6, 0, SCREEN_WIDTH / 6, 40)]; 106 | [self.emojiImageButotn setImage:[UIImage imageNamed:@"liaotian_ic_biaoqing_nor"] forState:UIControlStateNormal]; 107 | [self.emojiImageButotn setImage:[UIImage imageNamed:@"liaotian_ic_biaoqing_press"] forState:UIControlStateSelected]; 108 | [self.emojiImageButotn addTarget:self action:@selector(clickEmojiImageButton) forControlEvents:UIControlEventTouchUpInside]; 109 | [self.emojiFooterScrollView addSubview:self.emojiImageButotn]; 110 | self.emojiImageButotn.selected = NO; 111 | 112 | self.layout = [[CollectionViewFlowLayout alloc] init]; 113 | 114 | self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 130) collectionViewLayout:self.layout]; 115 | self.collectionView.backgroundColor = [UIColor colorWithRed:243 / 255.0 green:243 / 255.0 blue:243 / 255.0 alpha:1]; 116 | self.collectionView.dataSource = self; 117 | self.collectionView.delegate = self; 118 | [self addSubview:self.collectionView]; 119 | [self.collectionView registerClass:[EmojiCollectionViewCell class] forCellWithReuseIdentifier:@"UICollectionViewCell"]; 120 | 121 | self.pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 140, 0, 10)]; 122 | self.pageControl.currentPageIndicatorTintColor = [UIColor blackColor]; 123 | self.pageControl.pageIndicatorTintColor = [UIColor grayColor]; 124 | self.pageControl.userInteractionEnabled = NO; 125 | 126 | self.pageControl.numberOfPages = (self.defaultEmoticons.count - self.emoticonImages.count) / 21; 127 | [self addSubview:self.pageControl]; 128 | } 129 | 130 | - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 131 | { 132 | if (scrollView == self.collectionView) { 133 | if (scrollView.contentOffset.x >= SCREEN_WIDTH * ((self.defaultEmoticons.count - self.emoticonImages.count) / 21)) { 134 | self.pageControl.numberOfPages = self.emoticonImages.count % 21 == 0 ? self.emoticonImages.count % 21 : self.emoticonImages.count % 21 + 1 ; 135 | self.pageControl.currentPage = ((scrollView.contentOffset.x - SCREEN_WIDTH * ((self.defaultEmoticons.count - self.emoticonImages.count) / 21)) / SCREEN_WIDTH); 136 | self.emojiButotn.selected = NO; 137 | self.emojiImageButotn.selected = YES; 138 | 139 | } else { 140 | self.pageControl.numberOfPages = (self.defaultEmoticons.count - self.emoticonImages.count) / 21; 141 | self.pageControl.currentPage = (scrollView.contentOffset.x / SCREEN_WIDTH); 142 | self.emojiButotn.selected = YES; 143 | self.emojiImageButotn.selected = NO; 144 | } 145 | } 146 | } 147 | 148 | - (NSInteger) numberOfSectionsInCollectionView:(UICollectionView *)collectionView 149 | { 150 | return 1; 151 | } 152 | 153 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 154 | { 155 | return self.defaultEmoticons.count; 156 | } 157 | 158 | - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 159 | { 160 | EmojiCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"UICollectionViewCell" forIndexPath:indexPath]; 161 | if ([self.defaultEmoticons[indexPath.row] isKindOfClass:[UIImage class]]) { 162 | cell.image = self.defaultEmoticons[indexPath.row]; 163 | } else { 164 | cell.string = self.defaultEmoticons[indexPath.row]; 165 | } 166 | return cell; 167 | } 168 | 169 | - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 170 | { 171 | NSObject *str = self.defaultEmoticons[indexPath.row]; 172 | if (str) { 173 | if ([_delegate respondsToSelector:@selector(emojiButtonView:emojiText:)]) { 174 | [_delegate emojiButtonView:self emojiText:str]; 175 | } 176 | } 177 | } 178 | 179 | - (void)clickEmojiButton 180 | { 181 | self.emojiButotn.selected = YES; 182 | self.emojiImageButotn.selected = NO; 183 | [self.collectionView setContentOffset:CGPointMake(0, 0) animated:0]; 184 | self.pageControl.numberOfPages = (self.defaultEmoticons.count - self.emoticonImages.count) / 21; 185 | self.pageControl.currentPage = (self.collectionView.contentOffset.x / SCREEN_WIDTH); 186 | } 187 | 188 | - (void)clickEmojiImageButton 189 | { 190 | self.emojiButotn.selected = NO; 191 | self.emojiImageButotn.selected = YES; 192 | [self.collectionView setContentOffset:CGPointMake(SCREEN_WIDTH * 4, 0) animated:0]; 193 | self.pageControl.numberOfPages = self.emoticonImages.count % 21 == 0 ? self.emoticonImages.count % 21 : self.emoticonImages.count % 21 + 1 ; 194 | self.pageControl.currentPage = ((self.collectionView.contentOffset.x - SCREEN_WIDTH * ((self.defaultEmoticons.count - self.emoticonImages.count) / 21)) / SCREEN_WIDTH); 195 | } 196 | 197 | - (void)clickSenderButton:(UIButton *)sender 198 | { 199 | if ([_delegate respondsToSelector:@selector(emojiButtonView:sendButtonClick:)]) { 200 | [_delegate emojiButtonView:self sendButtonClick:sender]; 201 | } 202 | } 203 | 204 | @end 205 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/EmojiCollectionViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // EmojiCollectionViewCell.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/19. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | static NSString *const deleteButtonId = @"DeleteButtonId"; 11 | @interface EmojiCollectionViewCell : UICollectionViewCell 12 | @property (nonatomic,strong)NSString *string; 13 | @property (nonatomic,strong)UIImage *image; 14 | @end 15 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/EmojiCollectionViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // EmojiCollectionViewCell.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/19. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | #import "EmojiCollectionViewCell.h" 9 | 10 | @interface EmojiCollectionViewCell () 11 | @property (nonatomic,strong)UIButton *button; 12 | @end 13 | 14 | @implementation EmojiCollectionViewCell 15 | 16 | - (instancetype)initWithFrame:(CGRect)frame 17 | { 18 | if (self = [super initWithFrame:frame]) { 19 | [self setupUI]; 20 | } 21 | return self; 22 | } 23 | 24 | - (void)setupUI 25 | { 26 | self.button = [[UIButton alloc] init]; 27 | self.button.userInteractionEnabled = false; 28 | [self.contentView addSubview:self.button]; 29 | } 30 | 31 | - (void)setString:(NSString *)string 32 | { 33 | if ([string isEqual: deleteButtonId]) { 34 | [self.button setTitle:nil forState:UIControlStateNormal]; 35 | [self.button setImage:[UIImage imageNamed:@"DeleteEmoticonBtn"] forState:UIControlStateNormal]; 36 | [self.button setImage:[UIImage imageNamed:@"DeleteEmoticonBtnHL"] forState:UIControlStateHighlighted]; 37 | [self.button setFrame:CGRectMake(7, 3, self.contentView.frame.size.width - 10, self.contentView.frame.size.height - 6)]; 38 | } else { 39 | [self.button setImage:nil forState:UIControlStateNormal]; 40 | [self.button setImage:nil forState:UIControlStateHighlighted]; 41 | [self.button setTitle:string forState:UIControlStateNormal]; 42 | self.button.frame = CGRectInset(self.contentView.bounds, 0, 0); 43 | } 44 | } 45 | 46 | - (void)setImage:(UIImage *)image 47 | { 48 | self.button.frame = CGRectInset(self.contentView.bounds, 0, 0); 49 | [self.button setTitle:nil forState:UIControlStateNormal]; 50 | if (image) { 51 | [self.button setImage:image forState:UIControlStateNormal]; 52 | [self.button setImage:image forState:UIControlStateHighlighted]; 53 | } else { 54 | [self.button setImage:nil forState:UIControlStateNormal]; 55 | [self.button setImage:nil forState:UIControlStateHighlighted]; 56 | } 57 | } 58 | 59 | @end 60 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/EmotionImages.h: -------------------------------------------------------------------------------- 1 | // 2 | // Emotion.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/9/2. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | @interface EmotionImages : NSObject 12 | @property(nonatomic,strong)NSMutableArray* emotions; 13 | @property(nonatomic,strong)NSMutableArray* images; 14 | - (void)initEmotionImages; 15 | + (EmotionImages *)shareEmotinImages; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/EmotionImages.m: -------------------------------------------------------------------------------- 1 | // 2 | // Emotion.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/9/2. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import "EmotionImages.h" 10 | #import "IMEmotionEntity.h" 11 | @implementation EmotionImages 12 | 13 | + (EmotionImages *)shareEmotinImages 14 | { 15 | static EmotionImages *initEmotionImagesInstance = nil; 16 | static dispatch_once_t predicate; 17 | dispatch_once(&predicate, ^{ 18 | initEmotionImagesInstance = [[self alloc] init]; 19 | }); 20 | return initEmotionImagesInstance; 21 | } 22 | 23 | - (void)initEmotionImages 24 | { 25 | _emotions = [NSMutableArray array]; 26 | _images = [NSMutableArray array]; 27 | NSString *path = [[NSBundle mainBundle] pathForResource:@"emotion_icons.plist" ofType:nil]; 28 | NSArray* array = [NSArray arrayWithContentsOfFile:path]; 29 | NSMutableArray* entities = [NSMutableArray arrayWithCapacity:array.count]; 30 | IMEmotionEntity* entity = nil; 31 | NSDictionary* dic = nil; 32 | for (int i = 0; i < array.count; i++) { 33 | dic = array[i]; 34 | entity = [IMEmotionEntity entityWithDictionary:dic atIndex:i]; 35 | [entities addObject:entity]; 36 | [_emotions addObject:entity.name]; 37 | [_images addObject:[UIImage imageNamed:entity.imageName]]; 38 | } 39 | } 40 | @end 41 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/IMEmotionEntity.h: -------------------------------------------------------------------------------- 1 | // 2 | // IMEmotionEntity.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface IMEmotionEntity : NSObject 12 | 13 | + (IMEmotionEntity *)entityWithDictionary:(NSDictionary*)dic atIndex:(int)index; 14 | 15 | @property (nonatomic, copy) NSString* code;//for post, ex:[0] 16 | @property (nonatomic, copy) NSString* name;//for parse, ex:[微笑] 17 | @property (nonatomic, copy) NSString* imageName;//ex, Expression_1.png 18 | 19 | @end 20 | 21 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/IMEmotionEntity.m: -------------------------------------------------------------------------------- 1 | // 2 | // IMEmotionEntity.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import "IMEmotionEntity.h" 10 | 11 | @implementation IMEmotionEntity 12 | 13 | + (IMEmotionEntity *)entityWithDictionary:(NSDictionary*)dic atIndex:(int)index 14 | { 15 | IMEmotionEntity* entity = [[IMEmotionEntity alloc] init]; 16 | entity.name = dic[@"name"]; 17 | entity.code = [NSString stringWithFormat:@"[%d]", index];//[dic objectForKey:@"code"]; 18 | entity.imageName = [NSString stringWithFormat:@"Expression_%d.png", index+1];//[dic objectForKey:@"image"]; 19 | 20 | return entity; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/InputToolbar.h: -------------------------------------------------------------------------------- 1 | // 2 | // InputToolbar.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MoreButtonView.h" 11 | #import "VoiceButtonView.h" 12 | #import "EmojiButtonView.h" 13 | 14 | @interface InputToolbar : UIView 15 | 16 | +(instancetype) shareInstance; 17 | 18 | /** 19 | * 当前键盘是否可见 20 | */ 21 | @property (nonatomic,assign)BOOL keyboardIsVisiable; 22 | 23 | /** 24 | * 设置第一响应 25 | */ 26 | @property (nonatomic,assign)BOOL isBecomeFirstResponder; 27 | 28 | /** 29 | * 设置输入框最多可见行数 30 | */ 31 | @property (nonatomic,assign)NSInteger textViewMaxVisibleLine; 32 | 33 | /** 34 | * 点击发送后要发送的文本 35 | */ 36 | @property (nonatomic,copy)void(^sendContent)(NSObject *content); 37 | 38 | /** 39 | * InputToolbar所占高度 40 | */ 41 | @property (nonatomic,copy)void(^inputToolbarFrameChange)(CGFloat height,CGFloat orignY); 42 | 43 | /** 44 | * 添加moreButtonView代理 45 | */ 46 | - (void)setMorebuttonViewDelegate:(id)delegate; 47 | 48 | /** 49 | * 清空inputToolbar内容 50 | */ 51 | - (void)clearInputToolbarContent; 52 | 53 | /** 54 | * 重置inputToolbar 55 | */ 56 | - (void)resetInputToolbar; 57 | @end 58 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/InputToolbar.m: -------------------------------------------------------------------------------- 1 | // 2 | // InputToolbar.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width 10 | #define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height 11 | #define customKeyboardHeight 200 12 | #define InputToolbarHeight 49 13 | #define NavigationHeight 64 14 | 15 | #import "InputToolbar.h" 16 | #import "UIView+Extension.h" 17 | #import "EmotionImages.h" 18 | 19 | @interface InputToolbar () 20 | @property (nonatomic, assign)CGFloat textInputHeight; 21 | @property (nonatomic, assign)NSInteger TextInputMaxHeight; 22 | @property (nonatomic, assign)NSInteger keyboardHeight; 23 | @property (nonatomic,assign)BOOL showKeyboardButton; //YES: 显示键盘图标 24 | @property (nonatomic,assign)BOOL showMoreViewButton; //YES: 显示显示非键盘 25 | @property (nonatomic,assign)BOOL showVoiceViewButton; //YES: 显示显示非键盘 26 | 27 | @property (nonatomic,strong)UIButton *voiceButton; 28 | @property (nonatomic,strong)UITextView *textInput; 29 | @property (nonatomic,strong)UITextView *textUpload; 30 | @property (nonatomic,strong)UIButton *emojiButton; 31 | @property (nonatomic,strong)UIButton *moreButton; 32 | 33 | @property (nonatomic,strong)VoiceButtonView *voiceButtonView; 34 | @property (nonatomic,strong)EmojiButtonView *emojiButtonView; 35 | @property (nonatomic,strong)MoreButtonView *moreButtonView; 36 | 37 | @end 38 | 39 | @implementation InputToolbar 40 | 41 | - (VoiceButtonView *)voiceButtonView 42 | { 43 | if (!_voiceButtonView) { 44 | _voiceButtonView = [[VoiceButtonView alloc] init]; 45 | _voiceButtonView.width = self.width; 46 | _voiceButtonView.height = customKeyboardHeight; 47 | _keyboardHeight = customKeyboardHeight; 48 | } 49 | return _voiceButtonView; 50 | } 51 | 52 | - (EmojiButtonView *)emojiButtonView 53 | { 54 | if (!_emojiButtonView) { 55 | _emojiButtonView = [[EmojiButtonView alloc] init]; 56 | _emojiButtonView.delegate = self; 57 | _emojiButtonView.width = self.width; 58 | _emojiButtonView.height = customKeyboardHeight; 59 | _keyboardHeight = customKeyboardHeight; 60 | } 61 | return _emojiButtonView; 62 | } 63 | 64 | - (MoreButtonView *)moreButtonView 65 | { 66 | if (!_moreButtonView) { 67 | _moreButtonView = [[MoreButtonView alloc] init]; 68 | _moreButtonView.width = self.width; 69 | _moreButtonView.height = customKeyboardHeight; 70 | _keyboardHeight = customKeyboardHeight; 71 | } 72 | return _moreButtonView; 73 | } 74 | 75 | static InputToolbar* _instance = nil; 76 | +(instancetype) shareInstance 77 | { 78 | static dispatch_once_t onceToken ; 79 | dispatch_once(&onceToken, ^{ 80 | _instance = [[InputToolbar alloc] init] ; 81 | }); 82 | return _instance ; 83 | } 84 | 85 | + (instancetype)alloc 86 | { 87 | static dispatch_once_t onceToken ; 88 | dispatch_once(&onceToken, ^{ 89 | _instance = [[super alloc] init] ; 90 | }); 91 | return _instance ; 92 | } 93 | 94 | - (instancetype)initWithFrame:(CGRect)frame 95 | { 96 | if (self = [super initWithFrame:frame]) { 97 | 98 | self.backgroundColor = [UIColor colorWithRed:243 / 255.0 green:243 / 255.0 blue:243 / 255.0 alpha:1]; 99 | 100 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 101 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHidden:) name:UIKeyboardWillHideNotification object:nil]; 102 | 103 | [self layoutUI]; 104 | } 105 | return self; 106 | } 107 | 108 | - (void)dealloc 109 | { 110 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 111 | } 112 | 113 | - (void)keyboardWillShow:(NSNotification *)notification 114 | { 115 | CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 116 | _keyboardHeight = keyboardFrame.size.height; 117 | CGFloat duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 118 | [UIView beginAnimations:nil context:NULL]; 119 | [UIView setAnimationBeginsFromCurrentState:YES]; 120 | [UIView setAnimationDuration:duration]; 121 | [UIView setAnimationCurve:7]; 122 | self.y = keyboardFrame.origin.y - self.height; 123 | [UIView commitAnimations]; 124 | _inputToolbarFrameChange(self.height,self.y); 125 | self.keyboardIsVisiable = YES; 126 | } 127 | 128 | - (void)keyboardWillHidden:(NSNotification *)notification 129 | { 130 | CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 131 | CGFloat duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 132 | [UIView animateWithDuration:duration animations:^{ 133 | self.y = keyboardFrame.origin.y - self.height; 134 | }]; 135 | _inputToolbarFrameChange(self.height,self.y); 136 | self.keyboardIsVisiable = NO; 137 | [self setShowKeyboardButton:NO]; 138 | } 139 | 140 | - (void)layoutUI 141 | { 142 | self.voiceButton = [[UIButton alloc] initWithFrame:CGRectMake(5, 9, 30, 30)]; 143 | [self.voiceButton setImage:[UIImage imageNamed:@"liaotian_ic_yuyin_nor"] forState:UIControlStateNormal]; 144 | [self.voiceButton setImage:[UIImage imageNamed:@"liaotian_ic_press"] forState:UIControlStateHighlighted]; 145 | [self.voiceButton addTarget:self action:@selector(clickVoiceButton) forControlEvents:UIControlEventTouchUpInside]; 146 | [self addSubview:self.voiceButton]; 147 | 148 | self.textInput = [[UITextView alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.voiceButton.frame) + 5, 5, SCREEN_WIDTH - 115, 36)]; 149 | self.textInput.font = [UIFont systemFontOfSize:18]; 150 | self.textInput.layer.cornerRadius = 3; 151 | self.textInput.layer.masksToBounds = YES; 152 | self.textInput.returnKeyType = UIReturnKeySend; 153 | self.textInput.enablesReturnKeyAutomatically = YES; 154 | self.textInput.delegate = self; 155 | [self addSubview:self.textInput]; 156 | self.textUpload = [[UITextView alloc] init]; 157 | self.textUpload.delegate = self; 158 | 159 | 160 | self.emojiButton = [[UIButton alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.textInput.frame) + 5, 9, 30, 30)]; 161 | [self.emojiButton setImage:[UIImage imageNamed:@"liaotian_ic_biaoqing_nor"] forState:UIControlStateNormal]; 162 | [self.emojiButton setImage:[UIImage imageNamed:@"liaotian_ic_biaoqing_press"] forState:UIControlStateHighlighted]; 163 | [self.emojiButton addTarget:self action:@selector(clickEmojiButton) forControlEvents:UIControlEventTouchUpInside]; 164 | [self addSubview:self.emojiButton]; 165 | 166 | self.moreButton = [[UIButton alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.emojiButton.frame) + 5, 9, 30, 30)]; 167 | [self.moreButton setImage:[UIImage imageNamed:@"liaotian_ic_gengduo_nor"] forState:UIControlStateNormal]; 168 | [self.moreButton setImage:[UIImage imageNamed:@"liaotian_ic_gengduo_press"] forState:UIControlStateHighlighted]; 169 | [self.moreButton addTarget:self action:@selector(clickMoreButton) forControlEvents:UIControlEventTouchUpInside]; 170 | [self addSubview:self.moreButton]; 171 | } 172 | 173 | - (void)textViewDidChange:(UITextView *)textView 174 | { 175 | _textInputHeight = ceilf([self.textInput sizeThatFits:CGSizeMake(self.textInput.bounds.size.width, MAXFLOAT)].height); 176 | self.textInput.scrollEnabled = _textInputHeight > _TextInputMaxHeight && _TextInputMaxHeight > 0; 177 | if (self.textInput.scrollEnabled) { 178 | self.textInput.height = 5 + _TextInputMaxHeight; 179 | self.y = SCREEN_HEIGHT - _keyboardHeight - _TextInputMaxHeight - 5 - 8; 180 | self.height = _TextInputMaxHeight + 15; 181 | } else { 182 | self.textInput.height = _textInputHeight; 183 | self.y = SCREEN_HEIGHT - _keyboardHeight - _textInputHeight - 5 - 8; 184 | self.height = _textInputHeight + 15; 185 | } 186 | _inputToolbarFrameChange(self.height,self.y); 187 | } 188 | 189 | - (void)textViewDidBeginEditing:(UITextView *)textView 190 | { 191 | self.textInput.inputView = nil; 192 | self.textUpload.inputView = nil; 193 | } 194 | 195 | - (void)emojiButtonView:(EmojiButtonView *)emojiButtonView emojiText:(NSObject *)text 196 | { 197 | if ([text isEqual: deleteButtonId]) { 198 | NSInteger location = self.textUpload.selectedRange.location; 199 | NSString *string = [self.textUpload.text substringToIndex:location]; 200 | if ([string hasSuffix:@"]"]) { 201 | for (NSInteger i = string.length - 1; i >= 0; i --) { 202 | char c = [string characterAtIndex:i]; 203 | [self.textUpload deleteBackward]; 204 | if (c == '[') { 205 | break; 206 | } 207 | } 208 | [self.textInput deleteBackward]; 209 | } else { 210 | [self.textUpload deleteBackward]; 211 | [self.textInput deleteBackward]; 212 | } 213 | return; 214 | } 215 | if (![text isKindOfClass:[UIImage class]]) { 216 | [self.textInput replaceRange:self.textInput.selectedTextRange withText:(NSString *)text]; 217 | [self.textUpload replaceRange:self.textUpload.selectedTextRange withText:(NSString *)text]; 218 | } else { 219 | NSTextAttachment *textAttachment = [[NSTextAttachment alloc] initWithData:nil ofType:nil] ; 220 | textAttachment.image = (UIImage *)text; 221 | textAttachment.bounds = CGRectMake(0, - 5, self.textInput.font.lineHeight + 2, self.textInput.font.lineHeight + 2); 222 | NSAttributedString *imageText = [NSAttributedString attributedStringWithAttachment:textAttachment]; 223 | 224 | NSMutableAttributedString *strM = [[NSMutableAttributedString alloc] initWithAttributedString:self.textInput.attributedText]; 225 | [strM replaceCharactersInRange:self.textInput.selectedRange withAttributedString:imageText]; 226 | [strM addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:18] range:NSMakeRange(self.textInput.selectedRange.location, 1)]; 227 | self.textInput.attributedText = strM; 228 | self.textInput.selectedRange = NSMakeRange(self.textInput.selectedRange.location + 1,0); 229 | [self.textInput.delegate textViewDidChange:self.textInput]; 230 | 231 | NSString *stringImage = [EmotionImages shareEmotinImages].emotions[[[EmotionImages shareEmotinImages].images indexOfObject:(UIImage *)text]]; 232 | NSMutableString *mString = [NSMutableString stringWithString:self.textUpload.text]; 233 | [mString replaceCharactersInRange:self.textUpload.selectedRange withString:stringImage]; 234 | self.textUpload.text = mString; 235 | self.textUpload.selectedRange = NSMakeRange(self.textUpload.selectedRange.location + 1,0); 236 | [self.textInput.delegate textViewDidChange:self.textUpload]; 237 | } 238 | } 239 | 240 | - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 241 | { 242 | //默认键盘删除键 243 | if ([text isEqualToString:@""]) { 244 | //确定光标位置并且删除 245 | NSInteger location = self.textUpload.selectedRange.location; 246 | NSString *string = [self.textUpload.text substringToIndex:location]; 247 | if ([string hasSuffix:@"]"]) { 248 | for (NSInteger i = string.length - 1; i >= 0; i --) { 249 | char c = [string characterAtIndex:i]; 250 | [self.textUpload deleteBackward]; 251 | if (c == '[') { 252 | break; 253 | } 254 | } 255 | } else { 256 | [self.textUpload deleteBackward]; 257 | } 258 | } 259 | //键盘默认发送键 260 | if ([text isEqualToString:@"\n"]) { 261 | if (_sendContent) { 262 | _sendContent(self.textUpload.text); 263 | self.y = SCREEN_HEIGHT - _keyboardHeight - InputToolbarHeight; 264 | _inputToolbarFrameChange(self.height,self.y); 265 | } 266 | textView.text = nil; 267 | self.textUpload.text = nil; 268 | self.textInput.height = 36; 269 | self.height = InputToolbarHeight; 270 | return NO; 271 | } 272 | NSMutableString *mString = [NSMutableString stringWithString:self.textUpload.text]; 273 | [mString replaceCharactersInRange:self.textUpload.selectedRange withString:text]; 274 | self.textUpload.text = mString; 275 | 276 | return YES; 277 | } 278 | 279 | - (void)emojiButtonView:(EmojiButtonView *)emojiButtonView sendButtonClick:(UIButton *)sender 280 | { 281 | if (_sendContent) { 282 | _sendContent(self.textUpload.text); 283 | self.y = SCREEN_HEIGHT - _keyboardHeight - InputToolbarHeight; 284 | _inputToolbarFrameChange(self.height,self.y); 285 | } 286 | self.textInput.text = nil; 287 | self.textUpload.text = nil; 288 | self.textInput.height = 36; 289 | self.height = InputToolbarHeight; 290 | } 291 | 292 | - (void)clickVoiceButton 293 | { 294 | self.showMoreViewButton = NO; 295 | self.showKeyboardButton = NO; 296 | if (self.showVoiceViewButton) { 297 | [self.textInput resignFirstResponder]; 298 | self.textInput.inputView = nil; 299 | self.showVoiceViewButton = NO; 300 | } else { 301 | [self.textInput resignFirstResponder]; 302 | self.textInput.inputView = self.voiceButtonView; 303 | self.showVoiceViewButton = YES; 304 | } 305 | [self.textInput endEditing:YES]; 306 | [self.textInput becomeFirstResponder]; 307 | } 308 | 309 | - (void)clickEmojiButton 310 | { 311 | self.showMoreViewButton = NO; 312 | self.showVoiceViewButton = NO; 313 | if (!self.showKeyboardButton) { 314 | [self.textInput resignFirstResponder]; 315 | self.textInput.inputView = self.emojiButtonView; 316 | self.showKeyboardButton = YES; 317 | } else { 318 | [self.textInput resignFirstResponder]; 319 | self.textInput.inputView = nil; 320 | self.showKeyboardButton = NO; 321 | } 322 | [self.textInput endEditing:YES]; 323 | [self.textInput becomeFirstResponder]; 324 | } 325 | 326 | - (void)clickMoreButton 327 | { 328 | self.showVoiceViewButton = NO; 329 | self.showKeyboardButton = NO; 330 | if (self.showMoreViewButton) { 331 | [self.textInput resignFirstResponder]; 332 | self.textInput.inputView = nil; 333 | self.showMoreViewButton = NO; 334 | } else { 335 | [self.textInput resignFirstResponder]; 336 | self.textInput.inputView = self.moreButtonView; 337 | self.showMoreViewButton = YES; 338 | } 339 | [self.textInput endEditing:YES]; 340 | [self.textInput becomeFirstResponder]; 341 | } 342 | 343 | - (void)setShowKeyboardButton:(BOOL)showKeyboardButton 344 | { 345 | _showKeyboardButton = showKeyboardButton; 346 | 347 | // 默认的图片名 348 | NSString *image = @"liaotian_ic_biaoqing_nor"; 349 | NSString *highImage = @"liaotian_ic_biaoqing_press"; 350 | 351 | // 显示键盘图标 352 | if (showKeyboardButton) { 353 | image = @"liaotian_ic_jianpan_nor"; 354 | highImage = @"liaotian_ic_jianpan_press"; 355 | } 356 | 357 | // 设置图片 358 | [self.emojiButton setImage:[UIImage imageNamed:image] forState:UIControlStateNormal]; 359 | [self.emojiButton setImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted]; 360 | } 361 | 362 | - (void)setIsBecomeFirstResponder:(BOOL)isBecomeFirstResponder 363 | { 364 | if (isBecomeFirstResponder) { 365 | [self.textInput becomeFirstResponder]; 366 | [self.textUpload becomeFirstResponder]; 367 | } else { 368 | [self.textInput resignFirstResponder]; 369 | [self.textUpload resignFirstResponder]; 370 | } 371 | } 372 | 373 | - (void)setMorebuttonViewDelegate:(id)delegate 374 | { 375 | self.moreButtonView.delegate = delegate; 376 | } 377 | 378 | - (void)setTextViewMaxVisibleLine:(NSInteger)textViewMaxVisibleLine 379 | { 380 | _textViewMaxVisibleLine = textViewMaxVisibleLine; 381 | _TextInputMaxHeight = ceil(self.textInput.font.lineHeight * (textViewMaxVisibleLine - 1) + self.textInput.textContainerInset.top + self.textInput.textContainerInset.bottom); 382 | } 383 | 384 | - (void)clearInputToolbarContent 385 | { 386 | self.textInput.text = nil; 387 | self.textUpload.text = nil; 388 | } 389 | 390 | - (void)resetInputToolbar 391 | { 392 | self.textInput.text = nil; 393 | self.textUpload.text = nil; 394 | self.textInput.height = 36; 395 | self.height = InputToolbarHeight; 396 | } 397 | 398 | @end 399 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/MoreButtonView.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoreButtonScrollView.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | @class MoreButtonView; 11 | typedef enum { 12 | MoreButtonViewButtonTypeImages, 13 | MoreButtonViewButtonTypeCamera, 14 | MoreButtonViewButtonTypeFile, 15 | MoreButtonViewButtonTypeContact, 16 | MoreButtonViewButtonTypeLocation, 17 | MoreButtonViewButtonTypeSeal, 18 | MoreButtonViewButtonTypeEmail, 19 | } MoreButtonViewButtonType; 20 | 21 | @protocol MoreButtonViewDelegate 22 | - (void)moreButtonView:(MoreButtonView *)moreButtonView didClickButton:(MoreButtonViewButtonType )buttonType; 23 | @end 24 | 25 | @interface MoreButtonView : UIView 26 | @property (nonatomic,weak) iddelegate; 27 | @end 28 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/MoreButtonView.m: -------------------------------------------------------------------------------- 1 | // 2 | // MoreButtonScrollView.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width 9 | #define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height 10 | #import "MoreButtonView.h" 11 | 12 | @interface MoreButtonView () 13 | @end 14 | 15 | @implementation MoreButtonView 16 | 17 | - (instancetype)initWithFrame:(CGRect)frame 18 | { 19 | if (self = [super initWithFrame:frame]) { 20 | 21 | self.backgroundColor = [UIColor colorWithRed:243 / 255.0 green:243 / 255.0 blue:243 / 255.0 alpha:1]; 22 | [self layoutUI]; 23 | } 24 | return self; 25 | } 26 | 27 | - (void)layoutUI 28 | { 29 | [self addButtonWithIcon:@"img_defaulthead_nor" highIcon:@"img_defaulthead_nor" tag:MoreButtonViewButtonTypeImages title:@"Images"]; 30 | [self addButtonWithIcon:@"img_defaulthead_nor" highIcon:@"img_defaulthead_nor" tag:MoreButtonViewButtonTypeCamera title:@"Camera"]; 31 | [self addButtonWithIcon:@"img_defaulthead_nor" highIcon:@"img_defaulthead_nor" tag:MoreButtonViewButtonTypeFile title:@"File"]; 32 | [self addButtonWithIcon:@"img_defaulthead_nor" highIcon:@"img_defaulthead_nor" tag:MoreButtonViewButtonTypeContact title:@"Contact"]; 33 | [self addButtonWithIcon:@"img_defaulthead_nor" highIcon:@"img_defaulthead_nor" tag:MoreButtonViewButtonTypeLocation title:@"Location"]; 34 | [self addButtonWithIcon:@"img_defaulthead_nor" highIcon:@"img_defaulthead_nor" tag:MoreButtonViewButtonTypeSeal title:@"Seal"]; 35 | [self addButtonWithIcon:@"img_defaulthead_nor" highIcon:@"img_defaulthead_nor" tag:MoreButtonViewButtonTypeEmail title:@"Email"]; 36 | } 37 | 38 | - (void)addButtonWithIcon:(NSString *)icon highIcon:(NSString *)heighIcon tag:(int )tag title:(NSString *)title 39 | { 40 | UIButton *button = [[UIButton alloc] init]; 41 | button.tag = tag; 42 | [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside]; 43 | [button setBackgroundImage:[UIImage imageNamed:icon] forState:UIControlStateNormal]; 44 | [button setBackgroundImage:[UIImage imageNamed:heighIcon] forState:UIControlStateNormal]; 45 | [self addSubview:button]; 46 | 47 | UILabel *label = [[UILabel alloc] init]; 48 | label.font = [UIFont systemFontOfSize:14]; 49 | label.text = title; 50 | label.textAlignment = NSTextAlignmentCenter; 51 | [self addSubview:label]; 52 | } 53 | 54 | - (void)layoutSubviews 55 | { 56 | [super layoutSubviews]; 57 | NSMutableArray *mArrayButton = [NSMutableArray array]; 58 | NSMutableArray *mArrayLabel = [NSMutableArray array]; 59 | 60 | for (UIView *view in self.subviews) { 61 | if ([view isKindOfClass:[UIButton class]]) { 62 | [mArrayButton addObject:view]; 63 | } else if ([view isKindOfClass:[UILabel class]]) { 64 | [mArrayLabel addObject:view]; 65 | } 66 | } 67 | 68 | CGFloat buttonW = 55; 69 | CGFloat buttonH = buttonW; 70 | for (NSInteger i = 0; i < mArrayButton.count; i ++) { 71 | UIButton *button = mArrayButton[i]; 72 | UILabel *label = [mArrayLabel objectAtIndex:i]; 73 | CGFloat X = (((SCREEN_WIDTH - (4 * buttonW)) / 5) * ((i % 4) + 1)) + (buttonW * (i % 4)); 74 | CGFloat Y = 15 + (i / 4) * (buttonH + 35); 75 | button.frame = CGRectMake(X, Y, buttonW, buttonH); 76 | label.frame = CGRectMake(button.frame.origin.x, CGRectGetMaxY(button.frame) + 3, button.frame.size.width + 5, 20); 77 | } 78 | } 79 | 80 | - (void)buttonClick:(UIButton *)sender 81 | { 82 | if ([_delegate respondsToSelector:@selector(moreButtonView:didClickButton:)]) { 83 | [_delegate moreButtonView:self didClickButton:(MoreButtonViewButtonType)sender.tag]; 84 | } 85 | } 86 | 87 | @end 88 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/UITextView+Category.h: -------------------------------------------------------------------------------- 1 | // 2 | // UITextView+Category.h 3 | // Teeim 4 | // 5 | // Created by ShaoFeng on 16/8/25. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UITextView (Category) 12 | @end 13 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/UITextView+Category.m: -------------------------------------------------------------------------------- 1 | // 2 | // UITextView+Category.m 3 | // Teeim 4 | // 5 | // Created by ShaoFeng on 16/8/25. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import "UITextView+Category.h" 10 | 11 | @implementation UITextView (Category) 12 | - (void)_firstBaselineOffsetFromTop { 13 | } 14 | - (void)_baselineOffsetFromBottom { 15 | } 16 | @end 17 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/UIView+Extension.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Extension.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIView (Extension) 12 | @property (nonatomic, assign) CGFloat x; 13 | @property (nonatomic, assign) CGFloat y; 14 | @property (nonatomic, assign) CGFloat centerX; 15 | @property (nonatomic, assign) CGFloat centerY; 16 | @property (nonatomic, assign) CGFloat width; 17 | @property (nonatomic, assign) CGFloat height; 18 | @property (nonatomic, assign) CGSize size; 19 | @property (nonatomic, assign) CGPoint origin; 20 | @end 21 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/UIView+Extension.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Extension.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import "UIView+Extension.h" 10 | 11 | @implementation UIView (Extension) 12 | 13 | - (void)setX:(CGFloat)x 14 | { 15 | CGRect frame = self.frame; 16 | frame.origin.x = x; 17 | self.frame = frame; 18 | } 19 | 20 | - (void)setY:(CGFloat)y 21 | { 22 | CGRect frame = self.frame; 23 | frame.origin.y = y; 24 | self.frame = frame; 25 | } 26 | 27 | - (CGFloat)x 28 | { 29 | return self.frame.origin.x; 30 | } 31 | 32 | - (CGFloat)y 33 | { 34 | return self.frame.origin.y; 35 | } 36 | 37 | - (void)setCenterX:(CGFloat)centerX 38 | { 39 | CGPoint center = self.center; 40 | center.x = centerX; 41 | self.center = center; 42 | } 43 | 44 | - (CGFloat)centerX 45 | { 46 | return self.center.x; 47 | } 48 | 49 | - (void)setCenterY:(CGFloat)centerY 50 | { 51 | CGPoint center = self.center; 52 | center.y = centerY; 53 | self.center = center; 54 | } 55 | 56 | - (CGFloat)centerY 57 | { 58 | return self.center.y; 59 | } 60 | 61 | - (void)setWidth:(CGFloat)width 62 | { 63 | CGRect frame = self.frame; 64 | frame.size.width = width; 65 | self.frame = frame; 66 | } 67 | 68 | - (void)setHeight:(CGFloat)height 69 | { 70 | CGRect frame = self.frame; 71 | frame.size.height = height; 72 | self.frame = frame; 73 | } 74 | 75 | - (CGFloat)height 76 | { 77 | return self.frame.size.height; 78 | } 79 | 80 | - (CGFloat)width 81 | { 82 | return self.frame.size.width; 83 | } 84 | 85 | - (void)setSize:(CGSize)size 86 | { 87 | CGRect frame = self.frame; 88 | frame.size = size; 89 | self.frame = frame; 90 | } 91 | 92 | - (CGSize)size 93 | { 94 | return self.frame.size; 95 | } 96 | 97 | - (void)setOrigin:(CGPoint)origin 98 | { 99 | CGRect frame = self.frame; 100 | frame.origin = origin; 101 | self.frame = frame; 102 | } 103 | 104 | - (CGPoint)origin 105 | { 106 | return self.frame.origin; 107 | } 108 | @end 109 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/VoiceButtonView.h: -------------------------------------------------------------------------------- 1 | // 2 | // VoiceButtonView.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface VoiceButtonView : UIView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/Class/VoiceButtonView.m: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // VoiceButtonView.m 4 | // KeyBoard 5 | // 6 | // Created by ShaoFeng on 16/8/18. 7 | // Copyright © 2016年 Cocav. All rights reserved. 8 | // 9 | #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width 10 | #define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height 11 | 12 | #import "VoiceButtonView.h" 13 | #import "UIView+Extension.h" 14 | #import 15 | @interface VoiceButtonView () 16 | { 17 | AVAudioRecorder *audioRecorder; 18 | } 19 | @property (nonatomic,strong)UIView *leftView; 20 | @property (nonatomic,strong)UIImageView *mainView; 21 | @property (nonatomic,strong)UIView *rightView; 22 | @end 23 | 24 | @implementation VoiceButtonView 25 | 26 | - (instancetype)initWithFrame:(CGRect)frame 27 | { 28 | if (self = [super initWithFrame:frame]) { 29 | 30 | self.backgroundColor = [UIColor colorWithRed:243 / 255.0 green:243 / 255.0 blue:243 / 255.0 alpha:1]; 31 | [self layoutUI]; 32 | } 33 | return self; 34 | } 35 | 36 | - (void)layoutUI 37 | { 38 | self.mainView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mianView"]]; 39 | self.mainView.x = SCREEN_WIDTH / 2 - 40; 40 | self.mainView.y = 60; 41 | self.mainView.width = self.mainView.height = 80; 42 | [self addSubview:self.mainView]; 43 | self.mainView.userInteractionEnabled = YES; 44 | UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)]; 45 | [self.mainView addGestureRecognizer:swipe]; 46 | UILongPressGestureRecognizer *longpress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longpress:)]; 47 | [self.mainView addGestureRecognizer:longpress]; 48 | } 49 | 50 | - (void)swipe:(UISwipeGestureRecognizer *)recognizer 51 | { 52 | if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) { 53 | } else if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) { 54 | } 55 | } 56 | 57 | - (void)longpress:(UILongPressGestureRecognizer *)recognizer 58 | { 59 | NSString *name = [NSString stringWithFormat:@"%d.aiff",(int)[NSDate date].timeIntervalSince1970]; 60 | NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:name]; 61 | NSError *error; 62 | //  录音机 初始化 63 | audioRecorder = [[AVAudioRecorder alloc]initWithURL:[NSURL fileURLWithPath:path] settings:@{AVNumberOfChannelsKey:@2,AVSampleRateKey:@44100,AVLinearPCMBitDepthKey:@32,AVEncoderAudioQualityKey:@(AVAudioQualityMax),AVEncoderBitRateKey:@128000} error:&error]; 64 | [audioRecorder prepareToRecord]; 65 | [audioRecorder record]; 66 | audioRecorder.delegate = self; 67 | /* 68 |    1.AVNumberOfChannelsKey 通道数 通常为双声道 值2 69 |    2.AVSampleRateKey 采样率 单位HZ 通常设置成44100 也就是44.1k 70 |    3.AVLinearPCMBitDepthKey 比特率 8 16 24 32 71 |    4.AVEncoderAudioQualityKey 声音质量 72 |        ① AVAudioQualityMin  = 0, 最小的质量 73 |        ② AVAudioQualityLow  = 0x20, 比较低的质量 74 |        ③ AVAudioQualityMedium = 0x40, 中间的质量 75 |        ④ AVAudioQualityHigh  = 0x60,高的质量 76 |        ⑤ AVAudioQualityMax  = 0x7F 最好的质量 77 |    5.AVEncoderBitRateKey 音频编码的比特率 单位Kbps 传输的速率 一般设置128000 也就是128kbps 78 |      79 |    */ 80 | 81 | // NSLog(@"%@",path); 82 | } 83 | 84 | - (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{ 85 | NSLog(@"录音结束"); 86 | // 文件操作的类 87 | NSFileManager *manger = [NSFileManager defaultManager]; 88 | 89 | NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 90 | // 获得当前文件的所有子文件subpathsAtPath 91 | NSArray *pathlList = [manger subpathsAtPath:path]; 92 | 93 | // 需要只获得录音文件 94 | NSMutableArray *audioPathList = [NSMutableArray array]; 95 | // 遍历所有这个文件夹下的子文件 96 | for (NSString *audioPath in pathlList) { 97 | // 通过对比文件的延展名(扩展名 尾缀) 来区分是不是录音文件 98 | if ([audioPath.pathExtension isEqualToString:@"aiff"]) { 99 | // 把筛选出来的文件放到数组中 100 | [audioPathList addObject:audioPath]; 101 | } 102 | } 103 | // NSLog(@"%@",audioPathList); 104 | } 105 | 106 | @end 107 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/Emoji.plist: -------------------------------------------------------------------------------- 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 | 😣 26 | 😈 27 | 😉 28 | 😯 29 | 😕 30 | 😰 31 | 😋 32 | 😝 33 | 😓 34 | 😃 35 | 😂 36 | 😘 37 | 😒 38 | 😏 39 | 😶 40 | 😱 41 | 😖 42 | 😩 43 | 😔 44 | 😑 45 | 😚 46 | 😪 47 | 😇 48 | 🙊 49 | 👊 50 | 👎 51 | 52 | 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 | 🎓 79 | 🍖 80 | 81 | 82 | 83 | 💩 84 | 🎄 85 | 🍷 86 | 🎤 87 | 🏀 88 | 🀄 89 | 💣 90 | 📢 91 | 🌏 92 | 🍫 93 | 🎲 94 | 🏂 95 | 💡 96 | 💤 97 | 🚫 98 | 🌻 99 | 🍻 100 | 🎵 101 | 🏡 102 | 💢 103 | 📞 104 | 🚿 105 | 🍚 106 | 👪 107 | 👼 108 | 💊 109 | 🔫 110 | 🌹 111 | 🐶 112 | 💄 113 | 👫 114 | 👽 115 | 💋 116 | 🌙 117 | 🍉 118 | 🐷 119 | 💔 120 | 👻 121 | 👿 122 | 💍 123 | 🌲 124 | 🐴 125 | 👑 126 | 🔥 127 | 128 | 129 | 🕖 130 | 131 | 😁 132 | 🚀 133 | 134 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/DeleteEmoticonBtn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/DeleteEmoticonBtn@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/DeleteEmoticonBtnHL@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/DeleteEmoticonBtnHL@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_100@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_100@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_101@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_101@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_102@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_102@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_103@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_103@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_104@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_104@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_105@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_105@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_10@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_10@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_11@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_11@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_12@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_12@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_13@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_13@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_14@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_14@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_15@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_15@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_16@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_17@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_17@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_18@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_18@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_19@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_19@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_1@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_20@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_21@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_21@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_22@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_22@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_23@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_23@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_24@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_24@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_25@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_25@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_26@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_26@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_27@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_27@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_28@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_28@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_29@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_2@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_30@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_30@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_31@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_31@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_32@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_33@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_33@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_34@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_34@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_35@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_35@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_36@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_36@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_37@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_37@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_38@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_38@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_39@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_39@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_3@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_40@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_41@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_41@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_42@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_42@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_43@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_43@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_44@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_44@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_45@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_45@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_46@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_46@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_47@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_47@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_48@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_48@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_49@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_49@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_4@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_4@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_50@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_51@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_51@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_52@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_52@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_53@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_53@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_54@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_54@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_55@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_55@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_56@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_56@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_57@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_57@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_58@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_58@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_59@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_59@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_5@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_60@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_61@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_61@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_62@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_62@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_63@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_63@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_64@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_64@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_65@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_65@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_66@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_66@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_67@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_67@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_68@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_68@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_69@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_69@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_6@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_6@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_70@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_70@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_71@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_71@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_72@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_73@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_73@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_74@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_74@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_75@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_75@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_76@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_77@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_77@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_78@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_78@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_79@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_79@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_7@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_7@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_80@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_80@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_81@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_81@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_82@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_82@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_83@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_83@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_84@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_84@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_85@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_85@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_86@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_86@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_87@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_87@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_88@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_88@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_89@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_89@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_8@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_8@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_90@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_90@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_91@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_91@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_92@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_92@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_93@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_93@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_94@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_94@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_95@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_95@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_96@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_96@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_97@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_97@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_98@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_98@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_99@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_99@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_9@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/Expression_9@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/emotion/emotion_icons.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | name 7 | [微笑] 8 | 9 | 10 | name 11 | [撇嘴] 12 | 13 | 14 | name 15 | [色] 16 | 17 | 18 | name 19 | [发呆] 20 | 21 | 22 | name 23 | [得意] 24 | 25 | 26 | name 27 | [流泪] 28 | 29 | 30 | name 31 | [害羞] 32 | 33 | 34 | name 35 | [闭嘴] 36 | 37 | 38 | name 39 | [睡] 40 | 41 | 42 | name 43 | [大哭] 44 | 45 | 46 | name 47 | [尴尬] 48 | 49 | 50 | name 51 | [发怒] 52 | 53 | 54 | name 55 | [调皮] 56 | 57 | 58 | name 59 | [呲牙] 60 | 61 | 62 | name 63 | [惊讶] 64 | 65 | 66 | name 67 | [难过] 68 | 69 | 70 | name 71 | [酷] 72 | 73 | 74 | name 75 | [冷汗] 76 | 77 | 78 | name 79 | [抓狂] 80 | 81 | 82 | name 83 | [吐] 84 | 85 | 86 | name 87 | [偷笑] 88 | 89 | 90 | name 91 | [愉快] 92 | 93 | 94 | name 95 | [白眼] 96 | 97 | 98 | name 99 | [傲慢] 100 | 101 | 102 | name 103 | [饥饿] 104 | 105 | 106 | name 107 | [困] 108 | 109 | 110 | name 111 | [惊恐] 112 | 113 | 114 | name 115 | [流汗] 116 | 117 | 118 | name 119 | [憨笑] 120 | 121 | 122 | name 123 | [休闲] 124 | 125 | 126 | name 127 | [奋斗] 128 | 129 | 130 | name 131 | [咒骂] 132 | 133 | 134 | name 135 | [疑问] 136 | 137 | 138 | name 139 | [嘘] 140 | 141 | 142 | name 143 | [晕] 144 | 145 | 146 | name 147 | [疯了] 148 | 149 | 150 | name 151 | [衰] 152 | 153 | 154 | name 155 | [骷髅] 156 | 157 | 158 | name 159 | [敲打] 160 | 161 | 162 | name 163 | [再见] 164 | 165 | 166 | name 167 | [擦汗] 168 | 169 | 170 | name 171 | [抠鼻] 172 | 173 | 174 | name 175 | [鼓掌] 176 | 177 | 178 | name 179 | [溴大了] 180 | 181 | 182 | name 183 | [坏笑] 184 | 185 | 186 | name 187 | [左哼哼] 188 | 189 | 190 | name 191 | [右哼哼] 192 | 193 | 194 | name 195 | [哈欠] 196 | 197 | 198 | name 199 | [鄙视] 200 | 201 | 202 | name 203 | [委屈] 204 | 205 | 206 | name 207 | [快哭了] 208 | 209 | 210 | name 211 | [阴险] 212 | 213 | 214 | name 215 | [亲亲] 216 | 217 | 218 | name 219 | [吓] 220 | 221 | 222 | name 223 | [可怜] 224 | 225 | 226 | name 227 | [菜刀] 228 | 229 | 230 | name 231 | [西瓜] 232 | 233 | 234 | name 235 | [啤酒] 236 | 237 | 238 | name 239 | [篮球] 240 | 241 | 242 | name 243 | [乒乓] 244 | 245 | 246 | name 247 | [咖啡] 248 | 249 | 250 | name 251 | [饭] 252 | 253 | 254 | name 255 | [猪头] 256 | 257 | 258 | name 259 | [玫瑰] 260 | 261 | 262 | name 263 | [凋谢] 264 | 265 | 266 | name 267 | [嘴唇] 268 | 269 | 270 | name 271 | [爱心] 272 | 273 | 274 | name 275 | [心碎] 276 | 277 | 278 | name 279 | [蛋糕] 280 | 281 | 282 | name 283 | [闪电] 284 | 285 | 286 | name 287 | [炸弹] 288 | 289 | 290 | name 291 | [刀] 292 | 293 | 294 | name 295 | [足球] 296 | 297 | 298 | name 299 | [瓢虫] 300 | 301 | 302 | name 303 | [便便] 304 | 305 | 306 | name 307 | [月亮] 308 | 309 | 310 | name 311 | [太阳] 312 | 313 | 314 | name 315 | [礼物] 316 | 317 | 318 | name 319 | [拥抱] 320 | 321 | 322 | name 323 | [强] 324 | 325 | 326 | name 327 | [弱] 328 | 329 | 330 | name 331 | [握手] 332 | 333 | 334 | name 335 | [胜利] 336 | 337 | 338 | name 339 | [抱拳] 340 | 341 | 342 | name 343 | [勾引] 344 | 345 | 346 | name 347 | [拳头] 348 | 349 | 350 | name 351 | [差劲] 352 | 353 | 354 | name 355 | [爱你] 356 | 357 | 358 | name 359 | [NO] 360 | 361 | 362 | name 363 | [YES] 364 | 365 | 366 | name 367 | [爱情] 368 | 369 | 370 | name 371 | [飞吻] 372 | 373 | 374 | name 375 | [跳跳] 376 | 377 | 378 | name 379 | [发抖] 380 | 381 | 382 | name 383 | [怄火] 384 | 385 | 386 | name 387 | [转圈] 388 | 389 | 390 | name 391 | [磕头] 392 | 393 | 394 | name 395 | [回头] 396 | 397 | 398 | name 399 | [跳绳] 400 | 401 | 402 | name 403 | [投降] 404 | 405 | 406 | 407 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/img_defaulthead_nor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/img_defaulthead_nor.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/img_defaulthead_nor@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/img_defaulthead_nor@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/img_defaulthead_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/img_defaulthead_nor@3x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_nor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_nor.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_nor@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_nor@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_nor@3x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_press.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_press.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_press@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_press@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_press@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_biaoqing_press@3x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_nor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_nor.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_nor@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_nor@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_nor@3x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_press.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_press.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_press@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_press@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_press@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_gengduo_press@3x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_nor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_nor.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_nor@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_nor@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_nor@3x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_press.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_press.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_press@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_press@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_press@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_jianpan_press@3x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_press.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_press.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_press@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_press@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_press@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_press@3x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_yuyin_nor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_yuyin_nor.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_yuyin_nor@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_yuyin_nor@2x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_yuyin_nor@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/liaotian_ic_yuyin_nor@3x.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/KeyBoard/KerboardResource/mianView.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1170197998/QQ-WeChatKeyboard/d048adfac92bf4a5f334ec98754505575c5e93fa/KeyBoard/KeyBoard/KeyBoard/KerboardResource/mianView.png -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/PushViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // PushViewController.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface PushViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/PushViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // PushViewController.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/18. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width 9 | #define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height 10 | 11 | #import "PushViewController.h" 12 | #import "InputToolbar.h" 13 | #import "UIView+Extension.h" 14 | 15 | @interface PushViewController () 16 | @property (nonatomic,strong)InputToolbar *inputToolbar; 17 | @property (nonatomic,assign)CGFloat inputToolbarY; 18 | @property (weak, nonatomic) IBOutlet UITextView *textView; 19 | @end 20 | 21 | @implementation PushViewController 22 | 23 | - (void)viewDidLoad { 24 | [super viewDidLoad]; 25 | 26 | self.inputToolbar = [InputToolbar shareInstance]; 27 | [self.view addSubview:self.inputToolbar]; 28 | self.inputToolbar.textViewMaxVisibleLine = 4; 29 | self.inputToolbar.width = self.view.width; 30 | self.inputToolbar.height = 49; 31 | self.inputToolbar.y = self.view.height - self.inputToolbar.height; 32 | [self.inputToolbar setMorebuttonViewDelegate:self]; 33 | 34 | __weak typeof(self) weakSelf = self; 35 | self.inputToolbar.sendContent = ^(NSObject *content){ 36 | NSLog(@"上传服务器内容☀️:---%@",(NSString *)content); 37 | weakSelf.textView.text = (NSString *)content; 38 | }; 39 | 40 | self.inputToolbar.inputToolbarFrameChange = ^(CGFloat height,CGFloat orignY){ 41 | weakSelf.inputToolbarY = orignY; 42 | /* 43 | 如果是当前界面是tableView可以直接使用以下代码调试位置 44 | if (weakSelf.tableView.contentSize.height > orignY) { 45 | [weakSelf.tableView mas_updateConstraints:^(MASConstraintMaker *make) { 46 | make.bottom.mas_equalTo(0); 47 | }]; 48 | [weakSelf.tableView setContentOffset:CGPointMake(0, weakSelf.tableView.contentSize.height - orignY) animated:YES]; 49 | } 50 | */ 51 | }; 52 | [self.inputToolbar resetInputToolbar]; 53 | } 54 | 55 | - (void)dealloc { 56 | NSLog(@"dealloc"); 57 | } 58 | 59 | -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 60 | { 61 | self.inputToolbar.isBecomeFirstResponder = NO; 62 | } 63 | 64 | - (void)moreButtonView:(MoreButtonView *)moreButtonView didClickButton:(MoreButtonViewButtonType)buttonType 65 | { 66 | switch (buttonType) { 67 | case MoreButtonViewButtonTypeImages: 68 | { 69 | UIImagePickerController *ipc = [[UIImagePickerController alloc] init]; 70 | ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 71 | ipc.delegate = self; 72 | [self presentViewController:ipc animated:YES completion:nil]; 73 | } break; 74 | 75 | case MoreButtonViewButtonTypeCamera: 76 | { 77 | UIImagePickerController *ipc = [[UIImagePickerController alloc] init]; 78 | ipc.sourceType = UIImagePickerControllerSourceTypeCamera; 79 | ipc.delegate = self; 80 | [self presentViewController:ipc animated:YES completion:nil]; 81 | } break; 82 | 83 | default: 84 | break; 85 | } 86 | } 87 | 88 | - (void)inputToolbar:(InputToolbar *)inputToolbar orignY:(CGFloat)orignY 89 | { 90 | _inputToolbarY = orignY; 91 | } 92 | 93 | - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(nonnull NSDictionary *)info 94 | { 95 | [picker dismissViewControllerAnimated:YES completion:nil]; 96 | //UIImage *image = info[UIImagePickerControllerOriginalImage]; 97 | //图片选取成功 98 | } 99 | 100 | @end 101 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/17. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/17. 6 | // Copyright © 2016年 Cocav. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | 13 | @end 14 | 15 | @implementation ViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | } 20 | 21 | - (void)didReceiveMemoryWarning { 22 | [super didReceiveMemoryWarning]; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /KeyBoard/KeyBoard/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // KeyBoard 4 | // 5 | // Created by ShaoFeng on 16/8/17. 6 | // Copyright © 2016年 Cocav. 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 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 更多文章:http://blog.csdn.net/feng2qing?viewmode=list 2 | ## **前言** 3 | ### 1.由于项目需求,需要一个类似QQ/微信的聊天键盘,包括语音,emoji和发送图片,文件,位置,网上找了一番,要不功能不够完善,要不依赖太多,于是干脆自己写一个(在使用过程中如果发现什么问题或有什么建议,还望您提出来,共同进步) 4 | ### 2.微信的语音发送实现网上已经很多了,在这里打算做一个QQ语音发送的效果,此模块正在开发中.... 5 | 6 | ## **DEMO效果** 7 | ![Mou icon](http://g.recordit.co/1g8ZwxvWDn.gif) 8 | ##**类的介绍** 9 | ![这里写图片描述](http://img.blog.csdn.net/20160825084343802) 10 | 11 | ``` 12 | InputToolbar:键盘工具条 13 | VoiceButtonView:语音模块视图 14 | EmojiButtonView:Emoji模块视图 15 | MoreButtonView:加号模块视图(相册,相机,文件,位置...) 16 | CollectionViewFlowLayout:表情键盘CollectionView布局 17 | EmpjiCollectionViewCell:表情键盘collectionViewCell 18 | UIView+Extension:UIView工具类 19 | ``` 20 | 21 | ## **集成用法** 22 | 23 | ``` 24 | 加头文件: 25 | #import "InputToolbar.h" 26 | 遵守协议 27 | 28 | 添加属性: 29 | @property (nonatomic,strong)InputToolbar *inputToolbar; 30 | 创建inputToolbar 31 | self.inputToolbar = [InputToolbar shareInstance]; 32 | [self.view addSubview:self.inputToolbar]; 33 | 34 | 输入框最大显示行数 35 | self.inputToolbar.textViewMaxVisibleLine = 4; 36 | 布局inputToolbar 37 | self.inputToolbar.width = self.view.width; 38 | self.inputToolbar.height = 49; 39 | self.inputToolbar.y = self.view.height - self.inputToolbar.height; 40 | 设定代理 41 | [self.inputToolbar setMorebuttonViewDelegate:self]; 42 | 点击发送按钮回调,顺便传回输入内容 43 | __weak typeof(self) weakSelf = self; 44 | self.inputToolbar.sendContent = ^(NSObject *content){ 45 | 46 | NSLog(@"发射成功☀️:---%@",content); 47 | 48 | if ([content isKindOfClass:[NSTextAttachment class]]) { 49 | 50 | [weakSelf.textView.textStorage insertAttributedString:[NSAttributedString attributedStringWithAttachment:(NSTextAttachment *)content] atIndex:weakSelf.textView.selectedRange.location]; 51 | 52 | } else { 53 | 54 | weakSelf.textView.text = ((NSAttributedString *)content).string; 55 | } 56 | }; 57 | 58 | self.inputToolbar.inputToolbarFrameChange = ^(CGFloat height,CGFloat orignY){ 59 | _inputToolbarY = orignY; 60 | }; 61 | 62 | //点击MoreButtonView中的按钮会调用此方法(根据实际需求自行增删) 63 | - (void)moreButtonView:(MoreButtonView *)moreButtonView didClickButton:(MoreButtonViewButtonType)buttonType 64 | { 65 | switch (buttonType) { 66 | case MoreButtonViewButtonTypeImages: 67 | { 68 | //发送相册操作 69 | } break; 70 | 71 | case MoreButtonViewButtonTypeCamera: 72 | { 73 | //发送相机操作 74 | } break; 75 | case MoreButtonViewButtonTypeFile: 76 | { 77 | //发送文件操作 78 | } break; 79 | //......... 80 | default: 81 | break; 82 | } 83 | } 84 | ``` 85 | --------------------------------------------------------------------------------