微博项目中的键盘工具条

项目中的键盘工具条不能使用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开发小技巧--微博项目中的键盘工具条的更多相关文章

  1. iOS开发小技巧--初始化项目中修改APP安装后的名称

  2. iOS开发小技巧 - UILabel添加中划线

    iOS开发小技巧 遇到的问题: 给Label添加中划线,然后并没有效果 NSString *str = [NSString stringWithFormat:@"合计金额 ¥%.2f&quo ...

  3. iOS开发小技巧 - runtime适配字体

    iOS开发小技巧 - runtime适配字体 版权声明:本文为博主原创文章,未经博主允许不得转载,有问题可联系博主Email: liuyongjiesail@icloud.com 一个iOS开发项目无 ...

  4. iOS开发小技巧--即时通讯项目:使用富文本在UILabel中显示图片和文字;使用富文本占位显示图片

    Label借助富文本显示图片 1.即时通讯项目中语音消息UI的实现,样式如图: 借助富文本在UILabel中显示图片和文字 // 1.创建一个可变的富文本 NSMutableAttributedStr ...

  5. iOS开发小技巧--即时通讯项目:消息发送框(UITextView)高度的变化; 以及UITextView光标复位的小技巧

    1.即时通讯项目中输入框(UITextView)跟随输入文字的增多,高度变化的实现 最主要的方法就是监听UITextView的文字变化的方法- (void)textViewDidChange:(UIT ...

  6. iOS开发小技巧--TableView Group样式中控制每个section之间的距离

    一.TableView的Group样式中,默认的每个section都有sectionHeader和sectionFooter,只要调整这两个的大小就可以实现section之前的间距扩大或缩小 二.项目 ...

  7. iOS开发小技巧--TableView中headerView的循环利用,以及自定义的headerView

    一.首先要搞清楚,tableView中有两种headerView,一个是tableHeaderView,另一个是headerView.前者就一个;后者根据session决定个数 headerView的 ...

  8. 【转】IOS开发小技巧

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...

  9. ios开发小技巧之提示音播放与震动

    在ios开发中,有时候我们需要频繁播放某种提示声音,比如微博刷新提示音.QQ消息提示音等,对于这些短小且需要频繁播放的音频,最好将其加入到系统声音(system sound)里. 注意: 需要播放的音 ...

随机推荐

  1. React Native知识1-FlexBox 布局内容

    一:理论知识点 1:什么是FlexBox布局? 弹性盒模型(The Flexible Box Module),又叫Flexbox,意为“弹性布局”,旨在通过弹性的方式来对齐和分布容器中内容的空间,使其 ...

  2. YourSQLDba 配置——修改备份路径

    公司一直使用YourSQLDba做本地备份,磁带机将本地备份文件上带做异地容灾备份.近期整理.验证备份时发现本地备份目录命名五花八门 其中有历史原因,也有无规划化的缘故,看着这些五花八门的目录,越看越 ...

  3. 深入解析Windows操作系统笔记——CH3系统机制

    3.系统机制 微软提供了一些基本组件让内核模式的组件使用: 1.陷阱分发,包括终端,延迟的过程调用(DPC),异步过程调用(APC),异常分发以及系统服务分发 2.执行体对象管理器 3.同步,包括自旋 ...

  4. 大数据系列(1)——Hadoop集群坏境搭建配置

    前言 关于时下最热的技术潮流,无疑大数据是首当其中最热的一个技术点,关于大数据的概念和方法论铺天盖地的到处宣扬,但其实很多公司或者技术人员也不能详细的讲解其真正的含义或者就没找到能被落地实施的可行性方 ...

  5. mapreduce导出MSSQL的数据到HDFS

    今天想通过一些数据,来测试一下我的<基于信息熵的无字典分词算法>这篇文章的正确性.就写了一下MapReduce程序从MSSQL SERVER2008数据库里取数据分析.程序发布到hadoo ...

  6. Echarts 之三 —— 地市联动数据统计二

    一.简介 除了是一个地图之外,我们也可以使用多地图进行地市.区县联动数据统计.需求如下:展示整改广东省的地图,并显示统计信息,当点击某一个地市的时候,就显示该地市的地图,并统计该地市区县的数据信息.二 ...

  7. Nova 组件如何协同工作 - 每天5分钟玩转 OpenStack(24)

    Nova 物理部署方案 前面大家已经看到 Nova 由很多子服务组成,同时我们也知道 OpenStack 是一个分布式系统,可以部署到若干节点上,那么接下来大家可能就会问: Nova 的这些服务在物理 ...

  8. OpenStack调研:OpenStack是什么、版本演变、组件关系(Havana)、同类产品及个人感想

    一点调研资料,比较浅,只是觉得部分内容比较有用,记在这里: 首先,关于云计算,要理解什么是SAAS.PAAS.IAAS,这里不述:关于虚拟化,需要知道什么是Hypervisor,这里也不述: Open ...

  9. 浅谈Linux中的信号处理机制(三)

    一晃眼,已经到9月底了,都来不及去感慨时间匆匆.最近常常会想明年的今天我将会在那里干着什么样的工作?对未来又是憧憬又是担忧,压力山大.无论如何现在还是踏踏实实的学习吧,能这样安安静静学习的日子也不多了 ...

  10. Fragment的使用

    1.要在需要使用fragment的Activity布局中添加<fragment></fragment>标签给fragment预留位置: 2.指定fragment对应的类,在类中 ...