目录
- 表格视图跟随键盘的弹出而移动
- 模仿QQ拖拽弹出键盘
实例一: 表格视图跟随键盘的弹出而移动
1、订阅键盘的frame即将改变的通知(可以在viewDidLoad)
//监听键盘frame变化
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
2、通知到达后执行的方法,通知到达改变view的位置
- (void)keyboardWillChangeFrame:(NSNotification *)noti {
//NSLog(@"%@",noti.userInfo); //键盘弹出/消失的时候。获取最终位置
CGRect keyBoardFrame = [noti.userInfo[@"UIKeyboardFrameEndUserInfoKey"] CGRectValue];
//用键盘的最终的y值 - view自身的高度,就是要移动的距离
CGFloat ct = keyBoardFrame.origin.y - self.view.frame.size.height;
//获取键盘的动画时间
CGFloat duration = [noti.userInfo[@"UIKeyboardAnimationDurationUserInfoKey"] floatValue];
[UIView animateWithDuration:duration animations:^{ //平移view
self.view.transform = CGAffineTransformMakeTranslation(0, ct);
}];
}
3、在销毁方法中取消通知
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
4、拖动tableView取消键盘
#pragma mark - scrollView的代理方法 - 《UITableViewDelegate -》 UIScrollViewDelegate
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
//退出键盘
[self.view endEditing:YES];
}
5.点击cell 取消键盘:如果直接在控制器中加入这句没有用,会被截获,需要为Scrollview添加一个类目
@implementation UIScrollView (UITouch)
//UIView的Touch事件被UIScrollview捕获了,所以UIView里面的Touch事件没有响应——————解决方法:将UIScrollview的捕获的Touch事件往上传;————给UIScrollview添加类别
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//从scrollview - view,所以用superview.superview
[self.superview.superview endEditing:YES];
}
@end
实例二:在TableView上模仿QQ拖拽弹出键盘
原理:通过tableView的偏移量
1.获取最后一行tableView的偏移量
//在控制器中添加获取表格视图最大偏移量的属性
@property (nonatomic, assign) CGFloat maxContentOffset;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//.........
if (indexPath.row == self.messageFrames.count - 1) {
//记录滑动到最后一行的偏移量
self.maxContentOffset = tableView.contentOffset.y;
NSLog(@"row:%lf",self.maxContentOffset);
}
//3.返回cell
return cell;
}
- 通过偏移量来计算是否滚动到最下边,和快速滚动,用力网上拖可以弹出键盘
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//通过偏移量来计算是否滚动到最下边,和快速滚动,用力网上拖可以弹出键盘
if (scrollView.contentOffset.y > (self.maxContentOffset + 160) && self.maxContentOffset != 0){
[self.messageTextField becomeFirstResponder];
}
}