IM聊天页面监听键盘的弹出,聊天视图跟随键盘上移

  • 由于键盘弹出的时候是用到了通知,所以我们先来看看通知的用法:
  • 先创建两个类:LHLPersonLHLZhaoPin,我们想要实现招聘类去NSNotificationCenter发布通知,在发布之前Person类要监听通知.
    IM聊天页面监听键盘的弹出,聊天视图跟随键盘上移_第1张图片

    IM聊天页面监听键盘的弹出,聊天视图跟随键盘上移_第2张图片
  • ViewController.m中:
//
//  ViewController.m
//  通知练习
//
//  Created by admin on 16/11/4.
//  Copyright © 2016年 冷洪林. All rights reserved.
//

#import "ViewController.h"
#import "LHLPerson.h"
#import "LHLZhaoPin.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 初始化三个Person类
    LHLPerson *p1 = [[LHLPerson alloc] init];
    
    // 初始化两个公司
    LHLZhaoPin *tencent = [[LHLZhaoPin alloc] init];
    
    // 获取通知中心(单例)
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    
    // 监听通知(注意:监听一定要在注册之前,通俗的解释就是好比别人放屁,放完了再去肯定已经没有了,要在放之前就凑过去,哈哈哈 有点小邪恶)
    /**
     *  @param  addObserver : 通知的监听者
     *  @param SEL : 监听到通知后触发监听者的哪个方法
     *  @param name : 监听通知的名称  如果为nil,则不限制
     *  @param object : 监听哪个对象的通知  如果为nil,则不限制
     *
     */
    [center addObserver:p1 selector:@selector(oneNoti:) name:@"tencentNoti" object:nil];
    
    // 发布
    [center postNotificationName:@"tencentNoti"
            object:tencent
            userInfo:@{
                       @"title" : @"招聘前台"
                       }];
}
    // 移除通知
    [center removeObserver:p1]; // 移除p1所有的通知

@end
  • LHLPerson.h中:
//
//  LHLPerson.m
//  通知练习
//
//  Created by admin on 16/11/4.
//  Copyright © 2016年 冷洪林. All rights reserved.
//

#import "LHLPerson.h"

@implementation LHLPerson

- (void)oneNoti:(NSNotification *)noti
{
    NSLog(@"%@", noti);
}

@end
  • 程序运行效果


    IM聊天页面监听键盘的弹出,聊天视图跟随键盘上移_第3张图片

好了,通知的基本用法已经搞定,接下来我们切回主题,监听键盘的弹出,聊天视图跟随键盘上移:

  • 在开始之前我们先设置一下键盘的退出,在这里是在开始拖拽tableView的时候弹出键盘
// 拖拽tableView的时候弹出键盘
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}
  • viewDidLoad方法:
// 监听键盘弹出的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
  • 实现keyboardWillChangeFrame:方法并打印传过来的NSNotification:
- (void)keyboardWillChangeFrame:(NSNotification *)noti
{
    NSLog(@"%@", noti.userInfo);
}
  • 可以看到,在键盘弹出和退出时,都监听到了一次通知,我们需要用的是UIKeyboardFrameEndUserInfoKey:
    IM聊天页面监听键盘的弹出,聊天视图跟随键盘上移_第4张图片
  • 下面就该移动view的位置了,其实整个过程是这样的:键盘的视图是隐藏在view的最底部,当调用键盘的时候它就会立即从下面弹出,此时我们的view也跟随键盘整体向上移动.
  • 利用transform来改变view的frame:
- (void)keyboardWillChangeFrame:(NSNotification *)noti
{
    CGRect keyboardFrame =  [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    self.view.transform = CGAffineTransformMakeTranslation(0, keyboardFrame.origin.y - LHLScreenH);
}
  • 到这里我们的目的也就达到了:
IM聊天页面监听键盘的弹出,聊天视图跟随键盘上移_第5张图片

你可能感兴趣的:(IM聊天页面监听键盘的弹出,聊天视图跟随键盘上移)