具體思路
- 通過UIKeyboardWillChangeFrameNotification通知,監聽鍵盤的改變,同時可以得到鍵盤的Frame和動畫的持續時間,
- 新建鍵盤頂部工具條YSComposeToolBar,默認在底部,Y值隨着鍵盤的改變而改變,會一直顯示在鍵盤的最上面,動畫持續時間使用步驟一通知得到的時間
- 新建一個存放表情的YSEmoticonKeyboard(由YSEmoticonListView + YSEmoticonTabBar)整體View,替換掉原生的鍵盤。其中YSEmoticonListView指的是表情列表,YSEmoticonTabBar指的是表情類型,如:浪小花、默認表情、QQ表情等。
- YSEmoticonListView由UIScrollView+UIPageController 組成。UIScrollView存放着由YSEmoticonPageView裝着很多表情(Button)的列表組成。
- 所有的界面控制操作,都封裝在YSComposeViewController的控制器中里。
部分代碼說明
1.鍵盤通知
打印一下鍵盤的UIKeyboardWillChangeFrameNotification通知,我們可以得到鍵盤的Frame和動畫的持續時間。
{name = UIKeyboardWillChangeFrameNotification; userInfo = { UIKeyboardAnimationCurveUserInfoKey = 7; UIKeyboardAnimationDurationUserInfoKey = 0; UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 252}}"; UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 441.5}"; UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 442}"; UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 315}, {320, 253}}"; UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 316}, {320, 252}}"; UIKeyboardIsLocalUserInfoKey = 1; }}
鍵盤的Frame和動畫的持續時間
NSDictionary *userInfo = notification.userInfo; // 動畫的持續時間 double duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; // 鍵盤的frame CGRect keyboardF = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
2.替換掉原來的鍵盤
self.textView.inputView == nil : 使用的是系統自帶的鍵盤
self.textView.inputView = self.emoticonKeyboard; 指的是用表情view替換掉原來的鍵盤
懶加載一個View
#pragma mark - 懶加載 - (YSEmoticonKeyboard *)emoticonKeyboard { if (!_emoticonKeyboard) { self.emoticonKeyboard = [[YSEmoticonKeyboard alloc] init]; // 鍵盤的寬度 self.emoticonKeyboard.width = self.view.width; self.emoticonKeyboard.height = 216; } return _emoticonKeyboard; }
替換掉原來的鍵盤
/** * 切換鍵盤 */ - (void)switchKeyboard { // self.textView.inputView == nil : 使用的是系統自帶的鍵盤 if (self.textView.inputView == nil) { // 切換為自定義的表情鍵盤 self.textView.inputView = self.emoticonKeyboard; // 顯示鍵盤按鈕 self.toolbar.showKeyboardButton = YES; } else { // 切換為系統自帶的鍵盤 self.textView.inputView = nil; // 顯示表情按鈕 self.toolbar.showKeyboardButton = NO; } // 開始切換鍵盤 self.switchingKeybaord = YES; // 退出鍵盤 [self.textView endEditing:YES]; // 結束切換鍵盤 self.switchingKeybaord = NO; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 彈出鍵盤 [self.textView becomeFirstResponder]; }); }
項目結構
1.YSComposeViewController :發微博Controller
YSComposeToolbar:鍵盤頂部的工具條
YSEmoticonKeyboard:表情鍵盤(整體): YSEmoticonListView + YSEmoticonTabBar
YSEmoticonListView:表情列表,由YSEmoticonPageView + 分頁
YSEmonticonTabBar:表情底部TabBar,切換不同的表情
2.YSEmoticonListView結構,上面由一個YSEmoticonPageView,加載一頁的列表,有多少頁表情列表,就有多少個pageView。底部是一個分頁控件UIPageControl。
源代碼下載地址:https://github.com/jiangys/ChatKeyboard