IM聊天页面监听键盘的弹出,聊天视图跟随键盘上移
9090
8年前
<ul> <li> <p>由于键盘弹出的时候是用到了通知,所以我们先来看看通知的用法:</p> <ul> <li> <p>先创建两个类: LHLPerson 和 LHLZhaoPin ,我们想要实现招聘类去 NSNotificationCenter 发布通知,在发布之前Person类要监听通知.</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/3744e4c8aabffefe32d6cbd02bb9df50.png"></p> <p style="text-align:center"><img src="https://simg.open-open.com/show/015abc30f773a2914963bc5f0a07b77a.png"></p> </li> <li>ViewController.m 中:</li> </ul> </li> </ul> <pre> <code class="language-objectivec">// // 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</code></pre> <ul> <li>LHLPerson.h 中:</li> </ul> <pre> <code class="language-objectivec">// // 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</code></pre> <ul> <li> <p>程序运行效果</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/f78318211b771d16869eee87c2034d71.png"></p> </li> </ul> <p><strong>好了,通知的基本用法已经搞定,接下来我们切回主题,监听键盘的弹出,聊天视图跟随键盘上移:</strong></p> <ul> <li> <p>在开始之前我们先设置一下键盘的退出,在这里是在开始拖拽tableView的时候弹出键盘</p> </li> </ul> <pre> <code class="language-objectivec">// 拖拽tableView的时候弹出键盘 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { [self.view endEditing:YES]; }</code></pre> <ul> <li>viewDidLoad 方法:</li> </ul> <pre> <code class="language-objectivec">// 监听键盘弹出的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];</code></pre> <ul> <li> <p>实现 keyboardWillChangeFrame: 方法并打印传过来的 NSNotification :</p> </li> </ul> <pre> <code class="language-objectivec">- (void)keyboardWillChangeFrame:(NSNotification *)noti { NSLog(@"%@", noti.userInfo); }</code></pre> <ul> <li> <p>可以看到,在键盘弹出和退出时,都监听到了一次通知,我们需要用的是 UIKeyboardFrameEndUserInfoKey :</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/e2c30d0965a95e0af4f2cac158c960d7.png"></p> </li> <li> <p>下面就该移动view的位置了,其实整个过程是这样的:键盘的视图是隐藏在view的最底部,当调用键盘的时候它就会立即从下面弹出,此时我们的view也跟随键盘整体向上移动.</p> </li> <li> <p>利用transform来改变view的frame:</p> </li> </ul> <pre> <code class="language-objectivec">- (void)keyboardWillChangeFrame:(NSNotification *)noti { CGRect keyboardFrame = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; self.view.transform = CGAffineTransformMakeTranslation(0, keyboardFrame.origin.y - LHLScreenH); }</code></pre> <ul> <li> <p>到这里我们的目的也就达到了:</p> </li> </ul> <p style="text-align:center"><img src="https://simg.open-open.com/show/a0f5d6159b485c3b16a28482ca22a5f6.png"></p> <p> </p> <p>来自:http://www.jianshu.com/p/a19e7fb3c63f</p> <p> </p>