使用IQKeyboardManager的TextView高度过高时的问题及处理

以前使用IQKeyboardManager没遇到过什么问题,用它主要是为了解决2个问题:

1、点击TextField或者TextView等输入框控件的时候,视图可以自动弹到键盘上面,确保输入框不会被键盘挡住。

2、点击外部可以关闭键盘。

简单方便几行代码,一次性解决所有此类问题:

// 启用

[IQKeyboardManager sharedManager].enable=YES;

// 键盘上面多一个toolbar,可以显示placeHolder,还有快捷地在多个输入框之间切换,还有“Done”按钮,以免虚拟键盘上的“Return”有其他用途的时候,没有关闭键盘的按钮

[IQKeyboardManager sharedManager].enableAutoToolbar=YES;

// 一行代码配置好:外部点击关闭键盘

[IQKeyboardManager sharedManager].shouldResignOnTouchOutside=YES;

// 本文重点,问题所在

[IQKeyboardManager sharedManager].canAdjustTextView=YES;

先看图:


上图总共2个输入框,第一个是单行的textField,没有什么问题。

第二个是多行的IQTextView,也就是一个支持PlaceHolder的UITextView。键盘弹起的时候,这个输入框下面的部分总是被键盘挡住。

怎么办呢?

发现有canAdjustTextView这个配置,也就是上面代码的最后一行,看GitHub上作者的解释,觉得这个应该是TextView高度过大的时候,这个参数可以修复我们上面的问题。但是我配置了,没有起到作用。

那多大的高度算大呢?假设:

ScreenHeight =  手机高度

KbHeight = 键盘高度

NavAndStatusHeight = 导航栏和状态栏加起来的高度

TextViewHeight = TextView的高度

那么 (TextViewHeight > ScreenHeight - KbHeight - NavAndStatusHeight) 的时候,textView的高度就过大了,也就是键盘弹起的时候

TextViewHeight - (ScreenHeight - KbHeight - NavAndStatusHeight )的部分会被键盘遮挡。

IQKeyboardManager最多只会把输入框的顶部提到跟导航栏底部对齐,不会再高了。

那如何快速地解决这个问题呢?

目前临时方案是:

@weakify(textView, lineView, view)

//[[textView rac_textSignal] subscribeNext:^(id x) {

//[[IQKeyboardManager sharedManager] reloadLayoutIfNeeded];

//}];

//增加监听,当键盘出现或者改变时

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShow Notificationobject:nil]

subscribeNext:^(NSNotification*notification) {

CGSize kbSize;

//Getting UIKeyboardSize.

CGRect kbFrame = [[notificationuserInfo][UIKeyboardFrameEndUserInfoKey]CGRectValue];

CGRect screenSize = [[UIScreenmainScreen]bounds];

CGRect intersectRect =CGRectIntersection(kbFrame, screenSize);

if(CGRectIsNull(intersectRect))

{

kbSize =CGSizeMake(screenSize.size.width,0);

}

else

{

kbSize = intersectRect.size;

}

float height = screenSize.size.height- kbSize.height-kNavigationAndStatusBarHeight-20;

if(height > textView.mj_h) {

return;

}

@strongify(textView, view)

if(view ==nil)

{

return;

}

[textView remakeConstraints:^(MASConstraintMaker*make) {

make.right.left.top.equalTo(view);

make.height.equalTo(height);

}];

[[IQKeyboardManager sharedManager]reloadLayoutIfNeeded];

}];

////增加监听,当键盘退出时收出消息

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillHide Notificationobject:nil]

subscribeNext:^(idx) {

@strongify(textView, lineView, view)

if(view ==nil) {

return;

}

[UIView animateWithDuration:0.1animations:^{

[textView remakeConstraints:^(MASConstraintMaker*make) {

make.top.left.right.equalTo(view);

make.bottom.equalTo(lineView.top);

}];

[textView layoutIfNeeded];

[[IQKeyboardManager sharedManager]reloadLayoutIfNeeded];

}];

}];

监听键盘弹起和关闭事件,动态调整TextView的高度,使得TextView的顶部不会超过导航栏底部,就可以了。

有人知道更好的办法吗?请不离赐教。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • (一)Masonry介绍 Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布...
    木易林1阅读 7,216评论 0 3
  • Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性...
    3dcc6cf93bb5阅读 5,835评论 0 1
  • 这篇文章会对 IQKeyboardManager 自动解决键盘遮挡问题的方法进行分析。 最近在项目中使用了 IQK...
    MissLu16阅读 7,300评论 0 4
  • 写在前面(Github地址)主要记录了,我在学习Snapkit中的一些整理记录学习目标好好学习如何用代码来做自动布...
    Manba_小洛阅读 5,696评论 0 0
  • iOS_autoLayout_Masonry 概述 Masonry是一个轻量级的布局框架与更好的包装AutoLay...
    指尖的跳动阅读 5,017评论 1 4

友情链接更多精彩内容