一、刚才咱们监听键盘弹出事件,是怎么监听的,
1.监听键盘弹出事件的步骤
1)首先,在控制器的viewDidLoad方法中,创建一个NotificationCenter对象啊
2)通过center,让当前控制器的这个方法,监听这个通知,
3)然后,我们在这个通知里面,获取到键盘的Y值,
4)对我们的控制器的view,做了一次平移
2.注意,只要你监听了通知,
一定得怎么样,是不是一定得移除这个通知啊,
在什么时候、什么地方、移除这个通知
谁监听了这个通知,就在哪个对象的dealloc方法中,移除
现在,是谁监听这个通知,控制器
所以说,应该在控制器的什么方法里面,
在控制器的这个dealloc方法里面,在这个里面怎么办
- (void)dealloc{
//移除通知
[NSNotificationCenter
[[NSNotificationCenter defaultCenter] removeObserver:(id)];
把谁移除,自己吧,self
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
这样的话,它是不是就移除通知了
就是说,当前自己不再监听了吧
这样的话,当前自己就不再监听了
第一个,OK了,好,这是移除通知
二、那么,接下来,我们就实现一个什么效果呢
1.现在,这个键盘是不是没有弹出来,
没有弹出来呢,
假如说,我焦点进来,注意,现在这儿是不是写的这句话
“借你妹夫……”,是不是写的这句话啊,
然后,当我弹出的时候,走,
弹出的时候,这儿是不是还是显示这句话,
我希望当这个UIView向上平移以后,这个UITableView,是不是要把最后一行,给显示出来,
是不是要显示这个啊,
就是说,当键盘弹出完毕以后,把这个UITableView,滚动到哪里,
滚动到最后一行
让最后一行,滚到最上面吧
还记得怎么实现吗
是不是调用tableView的scrollTo指定的行吧
来,咱们试一下
2.把这个实现一下
在我们这个键盘弹出事件里面
它滚动完毕以后
//让UITableView的最后一行滚动到最上面
好,首先,获取UITableView,怎么办
self.tableView ,滚动,怎么写
调用scrollTo,scrollTo哪儿呢,
scrollToRowAtIndexPath:(NSIndexPath *) atScrollPosition:(UITableViewScrollPosition)
这个吧
1)参数三:首先,最后一个很简单,是否使用动画,YES,
2)第一个参数:最后一行,是不是要创建一个这个,最后一行的Index对象,
怎么创建
NSIndexPath *lastRowIdxPath = [NSIndexPath 有个叫forRow
那么,一共有几个section,现在,0,
是不是一个section,所以说,索引是不是就找第0个section
第几行吧,
最后一行,怎么办,当前这个messageFrames有多少条数据
最后一行,是不是它 减 1 这个索引
self.messageFrames.count - 1
这样,是不是创建了一个最后一行,的index对象,然后把它怎么办,
拷贝过来吧
对,传进来,
然后,传进来以后,接下来
3)要让最后一行,滚到哪个位置呢
UITableViewScrollPosition吧
是不是滚到最上面啊
UITableViewScrollPositionTop
然后呢,走一走,看它管用不管用
是不是滚出来了吧,
然后呢,注意,当它回去以后,是不是也是这个效果
三、然后,接下来,再实现这个效果,UITableView一滚动,键盘自动缩回去
1.首先,是不是要监听UITableView的滚动事件
或者说是,监听它的即将拖拽事件
是不是也行
只要你即将开始拖的时候,让它直接回去,是不是就可以吧
因为滚动事件,那个scrollViewDidScroll
会触发很多次啊
但是那个scrollViewWillBeginDragging,是不是只会触发一次
在你即将拖拽的时候,触发一次,
2.好,怎么样监听UITableView的willBeginDragging
事件
是不是代理啊
是不是我们之前的代理,是不是都设置好了
是不是设置好了
对,直接是不是,实现那个方法,就OK了吧,
来,找到代理方法
把这个注释复制过来,改成“代理方法”
叫啥
- tableView
scrollView吗,scrollViewWillBeginDragging
是不是UITableView继承自UIScrollView,
好,怎么办
让键盘,缩回去吧
好,怎么让键盘缩回去
怎么让把键盘叫出来,文本框获得焦点,是不是自动叫出来
怎么让把键盘缩回去,第一讲里面的“辞职”
或者说是,我是不是要通过程序,让当前控制器所管理的view,endEditing
想起来了吗
这样的话,所有是在这个控制器这个view里面的所有文本框,叫出来的键盘,都会缩回去啊
让控制器所管理的view,endEditing
结束编辑,就OK了
所以说,非常简单,就一句话
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
//把键盘叫回去,思路:让控制器所管理的UIView结束编辑
self.view
是不是一句话搞定了
看看真的管用吗,出来,滚一下
缩回去了吧
这个实现以后,我们关于键盘弹出、缩回去,基本就搞定了
四、有时候,大家可能会遇到这么一个问题,现在,我们键盘弹出,是不是没啥效果
1.键盘缩回去,是不是也没啥问题啊
但是,有时候,当键盘缩回去的时候,注意看
它这么一滑、键盘往回缩、你会发现,键盘先缩回去,然后这个UIView,再给它移下来
或者说是,UIScrollView,先平移上去,然后,键盘再弹出来,
也就是说,这两个有时候,会看到不同步的问题
不同步,就会看到灰色这个背景
解决这个问题的办法,就是,
让UIScrollView向上平移的时候,也用一个动画,来平移,
键盘弹出的时候,是用了0.25秒,
弹出来的
你那个UIScrollView,平移的时候,如果唰一下,就平移上去了
你已经平移上去了,键盘才慢慢往上爬
是不是看着中间就有一个黑色的背景啊
解决办法就是,让那个UIScrollView,让那个self.view平移的时候,也用一个动画,0.25秒的时候,平移上去,
这样的话,键盘和它是不是同步了吧
解决那个灰色背景,就是我们平移的时候,也用一个动画,
可以给大家写一下,
2.在哪里写啊
键盘那个事件吧,
- (void)keyboardWillChangeFrame
键盘那个事件
怎么平移,UIView 叫什么
animation,吧
UIView animate