iOS开发小技巧--微博项目中的键盘工具条
微博项目中的键盘工具条
项目中的键盘工具条不能使用inputAccessoryView,因为inputAccessoryView不能实现键盘隐藏的时候,工具条还显示在眼前,如图:


- 所以,果断决定将工具条添加到控制器View上面
/// 初始化键盘工具条
- (void)setupKeyboardToolBar
{
ChaosKeyboardToolbar *keyboardToolbar = [[ChaosKeyboardToolbar alloc] init];
keyboardToolbar.height = 44;
keyboardToolbar.x = 0;
keyboardToolbar.y = self.view.height - keyboardToolbar.height;
keyboardToolbar.width = self.view.width;
// 设置代理
keyboardToolbar.delegate = self;
self.keyboardToolbar = keyboardToolbar;
[self.view addSubview:keyboardToolbar];
}
- 通过监听键盘的fram变化,控制键盘工具条的位置
/// 键盘位置改变
- (void)keyboardWillChange:(NSNotification *)noti
{
if (self.switchingKeyboard) return;
/**
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 409}, {375, 258}}";
*/
// 动画时间
CGFloat duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
CGRect rect = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
[UIView animateWithDuration:duration animations:^{
self.keyboardToolbar.y = rect.origin.y - self.keyboardToolbar.height;
}];
}
- 工具条的内部实现,重点
代理方法
1.工具条中按钮的点击,肯定是要通知外界的,外界如何拿到工具条中的按钮,并且确定是哪个按钮.方法:在tag上绑定了枚举类型
<1>
typedef enum
{
ChaosKeyboardToolbarButtonTypeCamera, // 相机按钮
ChaosKeyboardToolbarButtonTypePicture, // 相册按钮
ChaosKeyboardToolbarButtonTypeMention, // @按钮
ChaosKeyboardToolbarButtonTypeTrend, // #按钮
ChaosKeyboardToolbarButtonTypeEmoticon, // 表情按钮
} ChaosKeyboardToolbarButtonType;
<2>抽取了初始化按钮的方法,方法中有按钮类型的参数type(枚举值),在tag上绑定
- (void)setButtonWithImage:(NSString *)image highlightImage:(NSString *)highlightImage type:(ChaosKeyboardToolbarButtonType)type
{
UIButton *btn = [[UIButton alloc] init];
[btn setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:highlightImage] forState:UIControlStateHighlighted];
[btn addTarget:self action:@selector(toolbarBtnClick:) forControlEvents:UIControlEventTouchUpInside];
// tag绑定按钮类型
btn.tag = type;
// 给切换键盘的按钮赋值
if (type == ChaosKeyboardToolbarButtonTypeEmoticon) {
self.keyboardButton = btn;
}
[self addSubview:btn];
}
2.在按钮点击的时间中执行代理方法,将按钮的类型一起传递给外界
@protocol ChaosKeyboardToolbarDelegate <NSObject>
@optional
- (void)keyboardToolbar:(ChaosKeyboardToolbar *)toolbar didClickBtn:(ChaosKeyboardToolbarButtonType)type;
@end
- (void)toolbarBtnClick:(UIButton *)btn
{
if ([self.delegate respondsToSelector:@selector(keyboardToolbar:didClickBtn:)]) {
[self.delegate keyboardToolbar:self didClickBtn:(int)btn.tag];
}
}
- 外界通过按钮的类型来判断点击的是哪个按钮
#pragma mark - ChaosKeyboardToolbarDelegate
- (void)keyboardToolbar:(ChaosKeyboardToolbar *)toolbar didClickBtn:(ChaosKeyboardToolbarButtonType)type
{
switch (type) {
case ChaosKeyboardToolbarButtonTypeCamera: // 相机
[self openCamera];
break;
case ChaosKeyboardToolbarButtonTypePicture: // 相册
[self openAlbum];
break;
case ChaosKeyboardToolbarButtonTypeMention: // @
ChaosLog(@"@");
break;
case ChaosKeyboardToolbarButtonTypeTrend: // #
ChaosLog(@"#");
break;
case ChaosKeyboardToolbarButtonTypeEmoticon: // 表情
[self switchKeyboard];
break;
}
}
3.外界切换普通键盘和表情键盘的方法

<方法一>工具条内部将切换的按钮暴露出去,外界拿到直接修改图片.缺点:一旦暴露出去,可以修改的不仅仅是图片了!
<方法二>向外界提供一个属性,外界调用此方法,工具条内部来实现图片的切换
/** 是否显示普通键盘按钮 */
@property(nonatomic,assign) BOOL showKeyboard;
重写setter
#pragma mark - 控制普通键盘和表情键盘图标
- (void)setShowKeyboard:(BOOL)showKeyboard
{
_showKeyboard = showKeyboard;
NSString *image = nil;
NSString *highlightImage = nil;
if (showKeyboard) { // 显示普通键盘
image = @"compose_keyboardbutton_background";
highlightImage = @"compose_keyboardbutton_background_highlighted";
} else { // 显示表情键盘
image = @"compose_emoticonbutton_background";
highlightImage = @"compose_emoticonbutton_background_highlighted";
}
[self.keyboardButton setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
[self.keyboardButton setImage:[UIImage imageNamed:highlightImage] forState:UIControlStateHighlighted];
}
iOS开发小技巧--微博项目中的键盘工具条的更多相关文章
- iOS开发小技巧--初始化项目中修改APP安装后的名称
- iOS开发小技巧 - UILabel添加中划线
iOS开发小技巧 遇到的问题: 给Label添加中划线,然后并没有效果 NSString *str = [NSString stringWithFormat:@"合计金额 ¥%.2f&quo ...
- iOS开发小技巧 - runtime适配字体
iOS开发小技巧 - runtime适配字体 版权声明:本文为博主原创文章,未经博主允许不得转载,有问题可联系博主Email: liuyongjiesail@icloud.com 一个iOS开发项目无 ...
- iOS开发小技巧--即时通讯项目:使用富文本在UILabel中显示图片和文字;使用富文本占位显示图片
Label借助富文本显示图片 1.即时通讯项目中语音消息UI的实现,样式如图: 借助富文本在UILabel中显示图片和文字 // 1.创建一个可变的富文本 NSMutableAttributedStr ...
- iOS开发小技巧--即时通讯项目:消息发送框(UITextView)高度的变化; 以及UITextView光标复位的小技巧
1.即时通讯项目中输入框(UITextView)跟随输入文字的增多,高度变化的实现 最主要的方法就是监听UITextView的文字变化的方法- (void)textViewDidChange:(UIT ...
- iOS开发小技巧--TableView Group样式中控制每个section之间的距离
一.TableView的Group样式中,默认的每个section都有sectionHeader和sectionFooter,只要调整这两个的大小就可以实现section之前的间距扩大或缩小 二.项目 ...
- iOS开发小技巧--TableView中headerView的循环利用,以及自定义的headerView
一.首先要搞清楚,tableView中有两种headerView,一个是tableHeaderView,另一个是headerView.前者就一个;后者根据session决定个数 headerView的 ...
- 【转】IOS开发小技巧
1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...
- ios开发小技巧之提示音播放与震动
在ios开发中,有时候我们需要频繁播放某种提示声音,比如微博刷新提示音.QQ消息提示音等,对于这些短小且需要频繁播放的音频,最好将其加入到系统声音(system sound)里. 注意: 需要播放的音 ...
随机推荐
- Android Support Library介绍
v4 Support Library 这个库是为Android 1.6(API版本为4)及以上的版本设计的,它包含大部分高版本中有而低版本中没有的API,包括application component ...
- Java内存以及GC
<深入理解Java虚拟机>第二三章摘要 Java内存区域与内存溢出 Java虚拟机中的内存分配图: 各个区域的特性总结如下表: 补充说明: 当多线程情形下,可能多个线程要在堆上分配内存,那 ...
- 详解tintColor属性
tintColor属性是iOS7之后新加的一个属性,这个属性定义了一个非默认的着色颜色值,其值的设置会影响到以视图为根视图的整个视图层次结构.它主要是改变控件的颜色,以获取一些有意思的视觉效果. ti ...
- iOS Swift-控制流(The Swift Programming Language)
iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...
- 项目管理详细任务(PMBOK2008)
启动 规划 执行 监控 收尾 选择项目经理 确定你将如何做计划-作为项目管理计划的一部分 组建最终项目团队 根据绩效基线进行绩效测量 确定收尾过程 确定公司文化和现存组织形式 创建项目范围说明书 执行 ...
- Linux内核的文件预读readahead
Linux的文件预读readahead,指Linux系统内核将指定文件的某区域预读进页缓存起来,便于接下来对该区域进行读取时,不会因缺页(page fault)而阻塞.因为从内存读取比从磁盘读取要快很 ...
- 功能强大而又简单易学的编程语言Python
Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大的通用型语言.首先,Python非常简单,以Hello World为例: Java的Hello World程序一般这么写: pub ...
- PHP 源码学习之线程安全
从作用域上来说,C语言可以定义4种不同的变量:全局变量,静态全局变量,局部变量,静态局部变量. 下面仅从函数作用域的角度分析一下不同的变量,假设所有变量声明不重名. 全局变量,在函数外声明,例如,in ...
- 基于注解的SpringMVC
相比传统的继承Controller体系中某些类的方式,SpringMVC的注解具有以下优点: 1.Controller不再需要继承某个特定类,只是简单的POJO. 2.请求映射的配置非常方便灵活. 3 ...
- linux下重启服务命令
1.查找进程id命令 ps -ef | grep -v grep|grep bdse-tour-service-1.0-jar-with-dependencies.jar | awk '{print ...