编辑:Bison
投稿: WzxJiang
"之前因为只有时间更新Github但没时间写讲解,所以WWeChat的教程耽搁了很久,久到我都不知道该怎么接着写…就写几个我觉得要注意的问题吧(如果对其他地方有疑问的在评论说下,在下一篇就附加讲解下有疑问的部分).:"
IM,历史纪录什么的还没加上去,但是能接受和发送消息了
1.如何让键盘弹入弹出更平滑.
2.用键盘出现、消失通知在退到后台进进到前台应该做的处理.
3.自动登录的实现
注册通知大家应该都是知道的
//使用NSNotificationCenter 鍵盤出現時 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardWillShowNotification object:nil]; //使用NSNotificationCenter 鍵盤隐藏時 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
怎么获取键盘的高度应该也是都知道,在通知的方法里
NSDictionary* info = [aNotification userInfo]; CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
然后UIView动画…然而那是非常不协调的.我们还得获取它的持续时间和动画类型
- (void)keyboardWasShown:(NSNotification )aNotification { NSDictionary info = [aNotification userInfo];
//键盘尺寸 CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size; //持续时间 CGFloat duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey]floatValue]; //动画类型 NSInteger anType = [[info objectForKey:UIKeyboardAnimationCurveUserInfoKey]integerValue]; [UIView animateKeyframesWithDuration:duration delay:0 options:anType animations:^{ CGRect rect = weakKeyView.frame; rect.origin.y -= kSize.height; weakKeyView.frame = rect; } completion:^(BOOL finished) { }]; } <br>
这样出来的效果就会非常协调
接上面,你要是添加了键盘出现和消失的通知,然后让TextField获取第一响应,这个时候你要是点Home键推到后台,然后再点App回到前台,你就会发现:你在通知的方法中有动画处理的组件消失了…
经过不懈的监听,找到了解决办法:在Appdelegate.m里面找到进入后台、进入前台的方法,然后发送通知//进入后台 - (void)applicationDidEnterBackground:(UIApplication *)application { //创建一个消息对象 NSNotification * notice = [NSNotification notificationWithName:@”EnterBackground” object:nil userInfo:nil]; //发送消息 [[NSNotificationCenter defaultCenter]postNotification:notice]; }
//进入前台 - (void)applicationWillEnterForeground:(UIApplication *)application { //创建一个消息对象 NSNotification * notice = [NSNotification notificationWithName:@"EnterForeground" object:nil userInfo:nil]; //发送消息 [[NSNotificationCenter defaultCenter]postNotification:notice]; }
在聊天的VC里面成为这两个通知的观察者
- (void)addEnterNofi { //进入前台 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterForeground) name:@"EnterForeground" object:nil]; //进入后台 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterBackground) name:@"EnterBackground" object:nil]; } <br>
在进到后台的方法中注销键盘出现和消失的通知
- (void)enterBackground { [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillHideNotification object:nil]; }
在进入前台的方法中再次添加为键盘出现和消失的通知的观察者
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self addKeyNofi]; });
这样就解决了这个问题,要注意的是一定要延迟0.5秒左右再添加为观察者.
### 3. 自动登录的实现
这里只是不考虑KeyChain的简单自动登录…
首先,在你AppDelegate.m中在self.window.rootViewController所指向的VC的.m文件中写入下面这些代码
- (void)viewWillAppear:(BOOL)animated { if ([[NSUserDefaults standardUserDefaults]objectForKey:@"userName"] && [[NSUserDefaults standardUserDefaults]objectForKey:@"password"]) { //在这写直接登录的方法,帐号密码为取出来的值 } else { //在这写手动登录的方法 } } 在你登录成功的回调中存值<br> [[NSUserDefaults standardUserDefaults]setObject:@"你的帐号" forKey:@"userName"]; [[NSUserDefaults standardUserDefaults]setObject:@"你的密码" forKey:@"password"]; //同步一下 [[NSUserDefaults standardUserDefaults]synchronize];
好了,第六篇就讲这些了,还是前面说的,如果对其他地方有疑问的在评论说下,在下一篇就附加讲解下有疑问的部分.
下载点这里—GitHub:WzxJiang
如果你喜欢这个项目,欢迎Star、Fork~
博主app上线啦,快点此来围观吧
更多经验请点击
好文推荐: 菜鸟程序员2015年年终总结