- 由于键盘弹出的时候是用到了通知,所以我们先来看看通知的用法:
- 先创建两个类:
LHLPerson
和LHLZhaoPin
,我们想要实现招聘类去NSNotificationCenter
发布通知,在发布之前Person类要监听通知.
-
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
-
程序运行效果
好了,通知的基本用法已经搞定,接下来我们切回主题,监听键盘的弹出,聊天视图跟随键盘上移:
- 在开始之前我们先设置一下键盘的退出,在这里是在开始拖拽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
:
- 下面就该移动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);
}
- 到这里我们的目的也就达到了: