聊天界面使用IQKeyboardManager导航栏及整个页面上移的解决方法

问题:

使用第三方库IQKeyboardManager时会使整个页面上移,导航栏页偏移出了显示范围。在聊天界面就会使得上面的消息看不到。

解决方法:

首先说明:在聊天界面使用IQKeyboardManager这个第三方库无法解决这个问题,至少我没找到解决办法。网上说的那些用ib创建UI,把控制器的view改成scrollview,或纯代码创建UI,重写loadView方法,然后把self.view = scrollview的解决方法会把布局搞乱。没有试,太麻烦。
解决思路:在聊天页面禁用IQKeyBoard,监控键盘弹出通知,自己写输入框随键盘的上移下移,自己动手丰衣足食。在网上看到一个解决思路非常不错:键盘弹出时把消息列表tableView的高度设为(屏幕高度 - 输入框高度 - 键盘高度),同时输入框上移;键盘消失时再把tableView的高度设为(屏幕高度 - 输入框的高度),同时输入框下移。这样可以完美解决聊天列表的消息显示问题和键盘遮挡问题。

键盘监控代码:

- (void)viewDidLoad {

    self.automaticallyAdjustsScrollViewInsets = NO;

    //监听键盘的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrameNotify:) name:UIKeyboardWillChangeFrameNotification object:nil]; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; _wasKeyboardManagerEnabled = [[IQKeyboardManager sharedManager]isEnabled]; [[IQKeyboardManager sharedManager] setEnable:NO]; } -(void)viewDidDisappear:(BOOL)animated { { [super viewWillDisappear:animated]; [[IQKeyboardManager sharedManager] setEnable:_wasKeyboardManagerEnabled]; } /** * 点击了return按钮(键盘最右下角的按钮)就会调用 */ - (BOOL)textFieldShouldReturn:(UITextField *)textField { [self sendMessage]; return YES; } /** * 当键盘改变了frame(位置和尺寸)的时候调用 */ -(void)keyboardWillChangeFrameNotify:(NSNotification*)notify { // 0.取出键盘动画的时间 CGFloat duration = [notify.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; // 1.取得键盘最后的frame CGRect keyboardFrame = [notify.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; // 2.计算控制器的view需要平移的距离 CGFloat transformY = keyboardFrame.origin.y - self.view.frame.size.height; // 3.执行动画 [UIView animateWithDuration:duration animations:^{ self.myTableView.frame = CGRectMake(0, 0, SCREENW, SCREENH + transformY - self.inputView.height); self.tableViewBottomConstraint.constant = -transformY + 44;// tableView的bottom距父视图bottom的距离 self.inputView.transform = CGAffineTransformMakeTranslation(0, transformY); [self scrollTableViewToBottom]; }]; } /** * tableView快速滚动到底部 */ - (void)scrollTableViewToBottom { if (self.messageFrames.count) { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(self.messageFrames.count - 1) inSection:0]; [self.myTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; } } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }

转载于:https://www.cnblogs.com/lurenq/p/6680915.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值