微博项目中的键盘工具条

项目中的键盘工具条不能使用inputAccessoryView,因为inputAccessoryView不能实现键盘隐藏的时候,工具条还显示在眼前,如图:

  • 所以,果断决定将工具条添加到控制器View上面
  1. /// 初始化键盘工具条
  2. - (void)setupKeyboardToolBar
  3. {
  4. ChaosKeyboardToolbar *keyboardToolbar = [[ChaosKeyboardToolbar alloc] init];
  5. keyboardToolbar.height = 44;
  6. keyboardToolbar.x = 0;
  7. keyboardToolbar.y = self.view.height - keyboardToolbar.height;
  8. keyboardToolbar.width = self.view.width;
  9. // 设置代理
  10. keyboardToolbar.delegate = self;
  11. self.keyboardToolbar = keyboardToolbar;
  12. [self.view addSubview:keyboardToolbar];
  13. }
  • 通过监听键盘的fram变化,控制键盘工具条的位置
  1. /// 键盘位置改变
  2. - (void)keyboardWillChange:(NSNotification *)noti
  3. {
  4. if (self.switchingKeyboard) return;
  5. /**
  6. UIKeyboardAnimationDurationUserInfoKey = "0.25";
  7. UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 409}, {375, 258}}";
  8. */
  9. // 动画时间
  10. CGFloat duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
  11. CGRect rect = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
  12. [UIView animateWithDuration:duration animations:^{
  13. self.keyboardToolbar.y = rect.origin.y - self.keyboardToolbar.height;
  14. }];
  15. }
  • 工具条的内部实现,重点代理方法

1.工具条中按钮的点击,肯定是要通知外界的,外界如何拿到工具条中的按钮,并且确定是哪个按钮.方法:在tag上绑定了枚举类型

<1>

  1. typedef enum
  2. {
  3. ChaosKeyboardToolbarButtonTypeCamera, // 相机按钮
  4. ChaosKeyboardToolbarButtonTypePicture, // 相册按钮
  5. ChaosKeyboardToolbarButtonTypeMention, // @按钮
  6. ChaosKeyboardToolbarButtonTypeTrend, // #按钮
  7. ChaosKeyboardToolbarButtonTypeEmoticon, // 表情按钮
  8. } ChaosKeyboardToolbarButtonType;

<2>抽取了初始化按钮的方法,方法中有按钮类型的参数type(枚举值),在tag上绑定

  1. - (void)setButtonWithImage:(NSString *)image highlightImage:(NSString *)highlightImage type:(ChaosKeyboardToolbarButtonType)type
  2. {
  3. UIButton *btn = [[UIButton alloc] init];
  4. [btn setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
  5. [btn setImage:[UIImage imageNamed:highlightImage] forState:UIControlStateHighlighted];
  6. [btn addTarget:self action:@selector(toolbarBtnClick:) forControlEvents:UIControlEventTouchUpInside];
  7. // tag绑定按钮类型
  8. btn.tag = type;
  9. // 给切换键盘的按钮赋值
  10. if (type == ChaosKeyboardToolbarButtonTypeEmoticon) {
  11. self.keyboardButton = btn;
  12. }
  13. [self addSubview:btn];
  14. }

2.在按钮点击的时间中执行代理方法,将按钮的类型一起传递给外界

  1. @protocol ChaosKeyboardToolbarDelegate <NSObject>
  2. @optional
  3. - (void)keyboardToolbar:(ChaosKeyboardToolbar *)toolbar didClickBtn:(ChaosKeyboardToolbarButtonType)type;
  4. @end
  1. - (void)toolbarBtnClick:(UIButton *)btn
  2. {
  3. if ([self.delegate respondsToSelector:@selector(keyboardToolbar:didClickBtn:)]) {
  4. [self.delegate keyboardToolbar:self didClickBtn:(int)btn.tag];
  5. }
  6. }
  • 外界通过按钮的类型来判断点击的是哪个按钮
  1. #pragma mark - ChaosKeyboardToolbarDelegate
  2. - (void)keyboardToolbar:(ChaosKeyboardToolbar *)toolbar didClickBtn:(ChaosKeyboardToolbarButtonType)type
  3. {
  4. switch (type) {
  5. case ChaosKeyboardToolbarButtonTypeCamera: // 相机
  6. [self openCamera];
  7. break;
  8. case ChaosKeyboardToolbarButtonTypePicture: // 相册
  9. [self openAlbum];
  10. break;
  11. case ChaosKeyboardToolbarButtonTypeMention: // @
  12. ChaosLog(@"@");
  13. break;
  14. case ChaosKeyboardToolbarButtonTypeTrend: // #
  15. ChaosLog(@"#");
  16. break;
  17. case ChaosKeyboardToolbarButtonTypeEmoticon: // 表情
  18. [self switchKeyboard];
  19. break;
  20. }
  21. }

3.外界切换普通键盘和表情键盘的方法

  • <方法一>工具条内部将切换的按钮暴露出去,外界拿到直接修改图片.缺点:一旦暴露出去,可以修改的不仅仅是图片了!

  • <方法二>向外界提供一个属性,外界调用此方法,工具条内部来实现图片的切换

  1. /** 是否显示普通键盘按钮 */
  2. @property(nonatomic,assign) BOOL showKeyboard;

重写setter

  1. #pragma mark - 控制普通键盘和表情键盘图标
  2. - (void)setShowKeyboard:(BOOL)showKeyboard
  3. {
  4. _showKeyboard = showKeyboard;
  5. NSString *image = nil;
  6. NSString *highlightImage = nil;
  7. if (showKeyboard) { // 显示普通键盘
  8. image = @"compose_keyboardbutton_background";
  9. highlightImage = @"compose_keyboardbutton_background_highlighted";
  10. } else { // 显示表情键盘
  11. image = @"compose_emoticonbutton_background";
  12. highlightImage = @"compose_emoticonbutton_background_highlighted";
  13. }
  14. [self.keyboardButton setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
  15. [self.keyboardButton setImage:[UIImage imageNamed:highlightImage] forState:UIControlStateHighlighted];
  16. }

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. Android 6.0 权限管理最佳实践

    博客: Android 6.0 运行时权限管理最佳实践 github: https://github.com/yanzhenjie/AndPermission

  2. iOS之 block,代替代理作为回调函数

    最近在弄一个视频会议的项目,但今天要说的跟视频基本没关系,我们来说一下在一个view中创建一个button,在controller中加载这个view 当button被点击后将时间响应传递给contro ...

  3. 安装gem所需知道的

    1 在中国rubygem源被墙了,所以不管是gem install 还是bundle install都需要修改默认的源,淘宝和ruby-china都提供了源. gem source -r http:/ ...

  4. ORACLE基本数据类型总结

    ORACLE基本数据类型(亦叫内置数据类型 built-in datatypes)可以按类型分为:字符串类型.数字类型.日期类型.LOB类型.LONG RAW& RAW类型.ROWID &am ...

  5. Linux命令学习总结:rmdir

    命令简介: 该命令用用来删除空目录,如果目录非空,则会出现错误.可以使用rm删除目录中的文件后,使用rmdir删除目录.也可以使用rm -rf替代rmdir命令.这是一个非常简单的命令.   命令语法 ...

  6. nginx 301 永久重定向

    nginx301跳转设置很简单,配置如下. (配置文件默认为nginx.conf,如果制定了新的配置文件,在新的文件配置即可.) server{ server_name xxx.com www.xxx ...

  7. 【Python数据分析】Python3多线程并发网络爬虫-以豆瓣图书Top250为例

    基于上两篇文章的工作 [Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 [Python数据分析]Python3操作Excel(二) 一些问题的解决与优化 已经正确地实现 ...

  8. Oracle数据库

    一.数据库表空间和数据文件 解析:一个数据库下可以开N个表空间,一个表空间可以包含N个数据文件.表空间是逻辑概念. 二.关于listener.ora位置 修改该界面上的数据,会影响指定路径的监听配置文 ...

  9. java内部类

    1.内部类 2.内部类的名字不会单独存在,根据外部类名的存在而存在.内部类的名字可以和外部其他类的名字一样. 3.这个this.num打印的是inner类里面的num 4.在内部类访问外部类成员变量方 ...

  10. 国内外前端(js)开发框架对比

    国内外前端开发框架对比 首先我们先对目前国内外主流前端开发框架做一个基本的了解,之后再对他们进行一个直观的对比. Bootstrap Bootstrap(http://www.bootcss.com) ...