文档章节

IOS博客项目搭建-15-发微博-自定义键盘上的Toolbar

Corwien
 Corwien
发布于 2016/05/15 01:37
字数 849
阅读 135
收藏 1
点赞 2
评论 0

自定义发布微博界面的工具栏,下图红框中的Toolbar。

toolbar

工具条是一个整体,可以封装一个类文件,来进行处理相关的操作。

##一、先创建一个工具条view继承UIView
IWComposeToolbar.m

图1

然后在发微博控制器IWComposeViewController.m中引用该工具toolbar文件

#import "IWComposeToolbar.h"

IWComposeViewController.m创建toolbar对象,并设置位置大小

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 设置导航栏属性
    [self setupNavBar];
    
    // 添加textView
    [self setupTextView];
    
    // 添加toolbar ****===***
    [self setupToolbar];
}

/**
 *  添加Toolbar
 */
-(void)setupToolbar
{
    IWComposeToolbar *toolbar = [[IWComposeToolbar alloc] init];
    
    // 设置frame
    CGFloat toolbarH = 44;
    CGFloat toolbarW = self.view.frame.size.width;  // 宽度为view的宽度
    CGFloat toolbarX = 0;   // 位置,在最左边
    CGFloat toolbarY = self.view.frame.size.height - toolbarH; // 无键盘时的toolbar高度
    toolbar.frame = CGRectMake(toolbarX, toolbarY, toolbarW, toolbarH);
    
    NSLog(@"toolbar...");
    
    // toolbar的父控件是textview还是控制器?经过分析新浪微博的toolbar,当键盘消失时,toolbar永远在view的最底部
    // 所以,我们确定其父控件为控制器
    [self.view addSubview:toolbar];
    
}


效果图:
图片说明

##二、接下来监听键盘的弹出和消失,来确定toolbar的位置 该如何做呢?是算键盘的高度然后将toolbar置于键盘上边还是有其他方法呢?这里我们可以考虑用更简单的方法,即transform来处理,以后凡是牵扯到一个控件要向上移动多少又要回到原来的位置,应该用transform,要回到原来的位置清除transform即可。

在setupTextView方法中添加监听键盘出现、退出的通知。

/**
 *添加textView
 */
- (void)setupTextView
{
    // 1.添加
    IWTextView *textView = [[IWTextView alloc] init];
    textView.font = [UIFont systemFontOfSize:15];
    
    // 垂直方向上永远可以拖拽
    textView.alwaysBounceHorizontal = YES;
    textView.delegate = self;
    
    textView.frame = self.view.bounds;
    textView.placeholder = @"分享新鲜事...分享新鲜事...分享新鲜事...分享新鲜事...分享新鲜事...";
    
    
    [self.view addSubview:textView];
    
    // 让textView成为第一响应者,弹出键盘
    // [textView becomeFirstResponder];
    self.textView = textView;
    
    // 2.监听textView文字改变的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:textView];
    
    // 3.监听键盘,当键盘frame改变时(键盘的Y值会变化,键盘的显示、隐藏),做出相应的操作===*****=======
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

/**
 * 键盘出现的时候调用
 *@param note
 */
-(void)keyboardWillShow:(NSNotification *)note
{
    IWLog(@"keyboardWillShow---%@", note.userInfo);
}


/**
 * 键盘即将退出的时候调用
 *@param note
 */
-(void)keyboardWillHide:(NSNotification *)note
{
    IWLog(@"keyboardWillHide---%@", note.userInfo);
}

打印数据,可以看到键盘的所有属性信息都在通知的字典里,包括frame变化。

图片说明

将toolbar设置为属性,然后赋值给其,方便在后边的方法里直接调用toolbar控件。

@property (nonatomic, weak)IWComposeToolbar *toolbar;

键盘出现时,根据通知监听的属性,获取键盘的frame,然后根据toolbar的transform,对其位置进行改变。

/**
 * 键盘出现的时候调用
 *@param note
 */
-(void)keyboardWillShow:(NSNotification *)note
{
    IWLog(@"keyboardWillShow---%@", note.userInfo);
    
    // 1.获取键盘的frame,从字典里取出来的为对象,还需要转CGRectValue
    CGRect keyboardF = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    
    // 2.取出键盘弹出的时间
    CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
    // 3.执行动画
    [UIView animateWithDuration:duration animations:^{
        self.toolbar.transform = CGAffineTransformMakeTranslation(0, -keyboardF.size.height);
        
    }];
    }

效果图:
输入图片说明

###整个流程(键盘出现和消失,toolbar的位置变化):

/**
 * 键盘即将退出的时候调用
 *@param note
 */
-(void)keyboardWillHide:(NSNotification *)note
{
    
    // 1.取出键盘弹出的时间
    CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
    // 2.执行动画
    [UIView animateWithDuration:duration animations:^{
        self.toolbar.transform = CGAffineTransformIdentity;
        
    }];

}

图片说明

通过效果图可以看到,toolbar已经在键盘的上边了 ^_^,凌晨1点半了,明天是周一,也该睡觉了。。。

© 著作权归作者所有

共有 人打赏支持
Corwien
粉丝 26
博文 149
码字总数 115164
作品 0
广州
程序员
iOS股票K线图、校园助手、适配iPhone X、版本检测等源码

iOS精选源码 快速创建menuItem控件 YHPhotoBrowser 优化的网络图片浏览 cocoaAsynSocket demo (包含客户端和服务端) SwipeMenuViewController现在支持iPhoneX和Swift4。 仿微信的提醒对话框 ...

sunnyaigd
2017/10/31
0
0
fir.im Weekly - iOS 开发中的 Git 流程

本期 fir.im Weekly 收集了微博上的热转资源,包含 Android、iOS 开发工具、源码等好用的轮子,还有一些 APP 设计的 Tips,希望对你有用。 精仿知乎日报 iOS 端 @我偏笑_NSNirvana花了将近一...

风起云飞fir_im
2015/11/03
0
0
Java转iOS-第一个项目总结(1)

0.前言 本人14年12月份,从网站开发组转到了移动开发组,自己的java两年半工作经验变成了objective-c零经验。2015年1月份新启动了一个移动项目,年后因为人事变动,自己从辅助开发变成了"核心...

蛙牛
2015/03/31
0
67
fir.im Weekly - iOS 保持界面流畅的技巧

生命不息,coding 不止。本期 fir.im Weekly 收集了微博上的热转资源,包含 Android、iOS 开发工具、源码分享,产品 UI 设计的好文章,还有一些程序员成长的 Tips,希望看完你会有所收获。 ...

风起云飞fir_im
2015/11/16
0
0
iOS高仿QQ录音、智能语音诗歌、高仿微信图片浏览源码

iOS精选源码 好看实用的日期时间选择器--CCTimePicker 高仿QQ录音功能 QQ侧滑抽屉效果 MMActionSheet介绍(自定义的类似于微信的UIActionSheet弹出框组件) 智能语音查询诗歌 仿课程表表格效果...

sunnyaigd
2017/10/25
0
0
Ionic系列——调用系统电话

1、需求描述 在ionic项目用调用手机的打电话功能。开始还想找cordova和ng-cordova的插件那,现在H5实现起来特别方便。 2、准备 在cordova中所有的URL Schemes 都是服从于白名单的,所以要现在...

龙马行空
2015/08/14
0
0
如何在CocoaPods中添加自定义的库

CocoaPods命令介绍 在 上一篇文章 中,已经介绍过CocoaPods的几条基本命令。 pod setup 用于初始化本地第三方库的Spec描述文件,所有的spec文件存都存放在 ~/.cocoapods 目录中。 pod instal...

泊竹
2013/12/09
0
0
iOS使用Objective-c自定义cordova插件(-)

本系列教程为博主初次使用开发,内容如有差错,欢迎指正,敬请谅解。 博客地址:http://blog.img421.com/iosshi-yong-object-czi-ding-yi-cordovacha-jian/ Mac安装ionic和cordova我们已经熟悉,...

Michaelyn
2017/10/23
0
0
iOS精美过度动画、视频会议、朋友圈、联系人检索、自定义聊天界面等源码

iOS精选源码 iOS 精美过度动画源码(http://www.code4app.com/thread-14827-1-1.html) iOS简易聊天页面以及容联云IM自定义聊天页面的实现思路(http://www.code4app.com/thread-30348-1-1.htm...

sunnyaigd
07/11
0
0
iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd
04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

重写视频播放进度条

需要注意的地方,基于html vedio 标准使用期去了解一下 1.想去掉视频默认的播放条,去掉controls属性。 2.需要预加载视频加上preload="auto"属性。 1.js代码 $(function(){ init(); }); var ...

轻量级赤影
7分钟前
0
0
saltstack管理任务计划-添加&删除

1.服务端配置 >>编辑 top.sls 文件 # vim /srv/salt/top.sls //修改为如下 base: '192.168.*.*': - crontest >>编辑crontest.sls文件添加计划任务 cron-test: cron.present: - name: /bin/to......

硅谷课堂
8分钟前
0
0
sql中多表查询及其左连字段

SELECT s.*,t.teach_name FROM `stu` s, `teacher` t WHERE s.teacher_id = t.row_id AND s.teacher_id = 1 s.* s表中 全部字段 t.teach_name t表中teach_name 字段 SELECT s.*,t.teach_nam......

森火
10分钟前
0
0
ES9-mapping参数

1.概述 ElasticSearch提供了丰富的参数对文档字段进行定义,比如字段的分词器、字段权重、日期格式、检索模型等等。可以查看官网每个参数的定义及使用:https://www.elastic.co/guide/en/ela...

贾峰uk
13分钟前
1
0
Java泛型学习

一、泛型的概念 List list = new ArrayList(); list.add("corn"); String name = (String) list.get(0); 1、这里将一个对象放入集合中,集合不会记住次对象的类型,当再次从集合中取出此对象...

cjxcloud
15分钟前
0
0
android屏幕适配

android屏幕适配 采用的是鸿阳的适配方式,项目依赖: compile 'com.zhy:autolayout:1.4.5' 使用步骤: 在manifest文件中标注你的设计图尺寸 <meta-data android:name="design_width" andro...

android-key
20分钟前
0
0
istio 0.8 安装步骤

============================ istio 0.8 安装步骤--------------------------------------- istio 0.8 安装步骤 1.安装k8s环境 参考:http://sealyun.com/pro/products/ master,salve两台机......

xiaomin0322
22分钟前
10
0
tmux 退出不干净问题

tmux ls 已经没有窗口了,但是显示还有在登入 只有强制T下线了。

NLGBZJ
22分钟前
0
0
卡辛斯基的警告

卡辛斯基的警告 作者: 阮一峰 1、 1978年5月25日,美国西北大学的工程教授巴克利·克利斯(Buckley Crist),收到了邮政局退回的一个包裹。 这个包裹寄往芝加哥大学,但是收件人“查无此人”...

祖冲之
23分钟前
1
0
如何一周内学会编程?实战项目中总结经验[图]

如何一周内学会编程?实战项目中总结经验[图]: 我知道有很多草根肯定都是日常有很多各种各样,自己认为非常有价值的想法,但是,苦于自己没有技术,无法实现自己的需求,典型的属于“就差一...

原创小博客
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部