首页澳门新葡亰官方网站 › iOS IM开垦提出(三卡塔尔国加多叁个自定义键盘,iosim

iOS IM开垦提出(三卡塔尔国加多叁个自定义键盘,iosim

iOS IM开发建议(三)添加一个自定义键盘,iosim

  各类的主流IM,都有自己定义的键盘:有表情键盘,选图片的键盘。其实都是一个inputView。  

  首先,我们要确定,我们的键盘是输入框调用的。也就是,我们可以设置的是某一个textView的inputView。

// 让键盘进入编辑状态,替换输入源为自定义的fv
// fv 是一个自定义的UIView
- (void)callFaceKeyBoard:(UIButton *)button {
    [ktextView becomeFirstResponder];
    ktextView.inputView = fv;
    [ktextView reloadInputViews];
    [ktextView.inputView becomeFirstResponder];// 把自定义键盘设置为第一响应
}

  现在这个键盘是调出来了。那我们看看键盘怎么实现。

 1 .h
 2 #import <UIKit/UIKit.h>
 3 
 4 @interface FaceKeyboardView : UIView
 5 // 点击了哪一个表情
 6 @property(nonatomic,copy)void (^TapActionBlock)(NSInteger faceID);
 7 // 发送信息
 8 @property(nonatomic,copy)void (^SendEmojiBlock)();
 9 
10 - (instancetype)initWithFrame:(CGRect)frame faceArray:(NSArray *)facesArray;
11 @end
12 
13 
14 
15 .m
16 
17 #import "FaceKeyboardView.h"
18 @implementation FaceKeyboardView{
19     NSMutableArray * dataArray;// 表情的资源数组
20     UIScrollView * scrollView;// 主的选折页面
21     UIButton * sendButton;// 发送按钮
22 }
23 // 这个一定要实现 而且要设置YES
24 - (BOOL)canBecomeFirstResponder {
25     return YES;
26 }
27 - (instancetype)initWithFrame:(CGRect)frame faceArray:(NSArray *)facesArray{
28     self = [super initWithFrame:frame];
29     if(self) {
30         //设置发送按钮
31                code...
32         //设置主体内容
33         [self setScrollViewContent:facesArray];
34     }
35     return self;
36 }
37 
38 - (void)setScrollViewContent:(NSArray *)array {
39     //这里布置好每一个表情的view 添加点击事件
40 }
41 
42 - (void)touchThisView:(UIGestureRecognizer *)tap {
43     if([tap.view isKindOfClass:[UIImageView class]])
44     if(self.TapActionBlock) {
45         self.TapActionBlock(tap.view.tag);
46     }
47 }
48 
49 - (void)send:(UIButton *)button {
50     if(self.SendEmojiBlock){
51         self.SendEmojiBlock();
52     }
53 }
54 
55 @end
56             

  到这里,只要实现block,把对应的东西添加到textView里面就好了。

  当然要关掉它的话,就把textView的inputView设置为nil。

 

IM开发建议(三)添加一个自定义键盘,iosim
各类的主流IM,都有自己定义的键盘:有表情键盘,选图片的键盘。其实都是一个inputView。...

// MARK: - WBEmotionToolBarDelegateextension WBEmotionKeyBoard: WBEmotionToolBarDelegate { func changeEmotion(index: Int) { let indexPath = IndexPath(item: 0, section: index) // toolBar与emotionCollectionView的联动,顺便完成toolBar与pageControl的联动 emtionCollectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.left, animated: false) changePageContol(indexPath: indexPath) }}

之前分享了UITextView的图片混排, 现在轮到定制表情键盘的实现.

  • 切换系统键盘, 把当前键盘收起来, 执行resignFistResponder方法
  • 设置textView的inputView属性, 更改为自定义的view
  • 弹出自定制键盘, 执行becomeFirstResponder

表情键盘在一些IM上用的很多, 如微信, QQ, 微博等.
这个demo是基于发布微博信息里的一个功能.

图片 1自定制表情键盘

数据源使用了一个emotions.bundle, 创建一个model, 三维数组存放数据

第二种联动实现则比较复杂,
用到一个小技巧:在scrollViewDidScroll方法里,
计算可见的两个cell的origin.x与当前collectionView的.contentOffset.x相减的绝对值进行比较

offset与originx的差的绝对值越小, 则显示的区域越大

/// 切换键盘@objc fileprivate func emotionKeyboard() { let emotionKeyboard = WBEmotionKeyBoard(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 271)) emotionKeyboard.backgroundColor = UIColor.white //要想切换键盘, 首先需要将当前的键盘收起来 //收起键盘 //becomeFirstResponder: 弹出键盘, 把光标定位到当前控件 //收起键盘后,要迅速弹出键盘, 会产生两次动画, 让第一次动画不执行 shouldAnimation = false textView.resignFirstResponder() shouldAnimation = true //如果是默认键盘, 弹出自定义键盘 if isDefaultKeyboard { //使用自定义的键盘 textView.inputView = emotionKeyboard isDefaultKeyboard = false //如果是自定义键盘, 弹出系统键盘 } else { textView.resignFirstResponder() textView.inputView = nil isDefaultKeyboard = true } //弹出键盘 textView.becomeFirstResponder()}

toolBar四个button点击触发的方法如下:

从上面的思维导图可知, 表情键盘view分为三个模块:

转载本站文章请注明出处:澳门新葡亰官方网站 http://www.radioritmo-bl.com/?p=448

上一篇:

下一篇:

相关文章