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>