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

  各类的主流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。

时间: 2024-08-07 00:18:42

iOS IM开发建议(三)添加一个自定义键盘的相关文章

ios 多线程开发(三)Run Loops

Run loops是线程相关的一些基本东西.一个run loop是一个处理消息的循环.用来处理计划任务或者收到的事件.run loop的作用是在有事做的时候保持线程繁忙,没事的时候让线程挂起. Run loop的管理并不是完全自动的.你仍然需要设计代码来在合适的时候启动run loop来相应事件.Cocoa和Core Foundation都提供了run loop对象来配置和管理run loop.程序并不需要创建这些对象,每个线程,包括主线程都有一个对应的run loop对象.只有非主线程需要明确

Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 (主要是NSLayoutConstraint 的使用)

当前位置: > Swift新手入门 > Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 时间:2014-09-10 16:49来源:未知 作者:啊成 举报 点击:562次 我会复习一下有关键盘扩展的内容,然后通过使用iOS 8中的新应用扩展API的设计一个摩斯码的输入法.完成这个教程大约需要花费20分钟.完整代码 概览 通过使用自定义输入法替换系统输入法,用户可以实现一些特别的功能.例如一个特别新颖的输入方式,或输入iOS原生并不支持的语言.自定义输入法的基本功能很简单

DHTMLX 前端框架 建立你的一个应用程序教程(三)--添加一个菜单

菜单的介绍 这篇我们介绍将菜单组建添加到上节中的布局中: 我们不对菜单做任何处理  只是在这里填充作为界面的一部分. 这里我们介绍的是dhtmlxMenu 组件. 这个组件的数据我们可以从XML或者JSON中加载 它有两种呈现类型: 1.源图片  它放在imgs文件夹中 2.自定义图片  任何你想使用的位置 添加菜单到布局中: 1.用dhtmlx.image_path 属性来设置源图片的全局路径 dhtmlx.image_path = "codebase/imgs/";dhtmlxEv

Android 开发第三弹:自定义左右菜单(滑动动画+蒙版效果)

下面的截图--哎,因为1080P在Windows 10上虽然适配了,但大部分软件并没有跟上,比如某个录制GIF的软件,所以这里有一定的偏移导致画面不完整,但效果大概就是这么一个效果了. MainUI.java 首先需要这么一个类,在这里一些UI的滑动呀之类的都会定义.首先吧,定义好这些变量,当然了,实际开发过程中肯定需要哪一个就添加上哪一个的. private Context context; // 上下文 private FrameLayout leftMenu; // 左边部分 privat

Tkinter小技巧:如何为窗口右上角的‘x’添加一个自定义的响应函数

不废话,直接上代码 import tkinter as tk from tkinter import messagebox main_window = tk.Tk() main_window.geometry('200x100') tk.Label(main_window, text='我是一个窗口').pack() def my_close(): # True or Flase res = messagebox.askokcancel('提示', '是否关闭窗口') if res == Tru

iOS 蓝牙开发(三)app作为外设被连接的实现(转)

转载自:www.cocoachina.com/ios/20151105/14071.html 原作者:刘彦玮 再上一节说了app作为central连接peripheral的情况,这一节介绍如何使用app发布一个peripheral,给其他的central连接 还是这张图,central模式用的都是左边的类,而peripheral模式用的是右边的类 peripheral模式的流程 1. 打开peripheralManager,设置peripheralManager的委托 2. 创建characte

iOS多线程开发(三)---Run Loop(四)

四,配置Run Loop源---配置源的过程就是源的创建调用过程 配置过程分为以下几个阶段---定义/创建(一个源)---安装(将输入源安装到所在Run Loop中)---注册(将输入源注册到客户端,协调输入源的客户端)---调用(通知输入源,开始工作) 4-1,定义自定义输入源 创建自定义输入源需要定义以下内容 1)输入源要处理的信息 2)使感兴趣的客户端知道如何和输入源交互的调度例程 3)处理其他任何客户发送请求的例程 4)使输入源失效的取消例程 Figure 3-2 Operating a

iOS多线程开发(三)---Run Loop(二,三)

二,何时使用Run Loop 对于辅助线程,在需要和线程有更多交互时,才使用Run Loop. 比如:1)使用端口或者自定义输入源来和其他线程通讯 2)使用线程定时器 3)Cocoa中使用任何performSelector...的方法(参考Table:Performing selectors on other threads) 4)使线程周期性工作 三,如何使用Run Loop对象 Run Loop对象提供了添加输入源,定时器和Run Loop的观察者以及启动Run Loop的接口,使用Run

IOS中使用.xib文件封装一个自定义View

1.新建一个继承UIView的自定义view,假设类名叫做 MyAppVew #import <UIKit/UIKit.h> @class MyApp; @interface MyAppView : UIView @property(strong,nonatomic) MyApp*app; +(instancetype)appView; @end MyAppView.h #import "MyAppView.h" #import "MyApp.h" @i