IOS解决TextField、TextView键盘遮挡问题(已封装好,三句代码解决)

前言:在我们ios开发过程中经常会遇到键盘遮挡问题,解决方法,网上搜索一大片,但总结起来其实就以下两点:

一、监听键盘的响应事件

    (1)监听键盘的响应事件上升:UIKeyboardWillShowNotification ;键盘隐藏UIKeyboardWillHideNotification

     (2)在UIKeyboardWillShowNotification事件中确定TextField、TextView在屏幕中的位置,然后再移动位置

      (3)在UIKeyboardWillHideNotification事件中复原位置

二、在TextField、TextView的代理中textFieldDidBeginEditing 确定TextField、TextView在屏幕中位置,然后在移动位置。

然而不管你使用上面的那种方法都会破坏你原本代码结构的完整性,所以本人就将其封装在一个object类中,这样不仅重用性高,代码结构完整,使用更是方便,可以说是三句代码就解决遮挡问题。

使用时只需要将WindyKeyBoard.m和WindyKeyBoard.h文件拖进工程

@property(nonatomic,strong)WindyKeyBoard*keyBoard;并实现其代理WindyKeyBoardDelegate就可以了,_keyBoard为全局变量

然后在

- (void)viewDidLoad {

}

方法中加入如下代码:

_keyBoard= [[WindyKeyBoardalloc]init];

_keyBoard.delegate=self;

完整项目git包含了各种情况下的TextField、TextView键盘遮挡问题,有需要的可以去下载,git地址为:https://github.com/cocoaliaolei/TextField_TextView.git 觉得有用的客官帮忙给个star吧,谢谢了

上代码:创建一个NSObject 类

.h文件如下:

//

//WindyKeyBoard.h

//WindKeyboard

//

//Created by winds on 2017/8/22.

//Copyright © 2017年东边的风. All rights reserved.

#import

@classWindyKeyBoard;

@protocolWindyKeyBoardDelegate

@optional

-(void)WindyKeyBoard:(BOOL)isUp withNotification:(NSNotification*)notifi;

-(void)WindyKeyBoardBtnClick:(UIButton*)btn;

@end

@interfaceWindyKeyBoard :NSObject

/**

*是否开启自动避免键盘遮挡

*默认YES

*/

@property(nonatomic,assign)BOOLisSuitable;

/**

*是否显示键盘上隐藏按钮

*默认YES

*/

@property(nonatomic,assign)BOOLisShowDownBtn;

/**

* delegate:只能为UIViewColtroller或UIView 或其子类

*/

@property(nonatomic,weak)iddelegate;

@end


.m文件如下: 

//

//WindyKeyBoard.m

//WindKeyboard

//

//Created by winds on 2017/8/22.

//Copyright © 2017年东边的风. All rights reserved.

//

#import"WindyKeyBoard.h"

@interfaceWindyKeyBoard()

{

__blockCGFloatoriginalY;

}

@property(nonatomic,strong)UIButton*btn;

@end

@implementationWindyKeyBoard

/**

*btnWide隐藏键盘按钮宽度

*btnHeight隐藏键盘按钮宽度

*/

staticCGFloatbtnWide=40;

staticCGFloatbtnHeight =30;

-(void)dealloc{

[[NSNotificationCenterdefaultCenter]removeObserver:selfname:UIKeyboardWillShowNotificationobject:nil];

[[NSNotificationCenterdefaultCenter]removeObserver:selfname:UIKeyboardWillHideNotificationobject:nil];

[_btnremoveFromSuperview];

_btn=nil;

NSLog(@"--------%s",__FUNCTION__);

}

-(UIButton*)btn{

if(!_btn) {

_btn= [UIButtonbuttonWithType:UIButtonTypeCustom];

_btn.frame=CGRectMake(WD-btnWide,HG,btnWide,btnHeight);

[_btnaddTarget:selfaction:@selector(downKeyBoard:)forControlEvents:UIControlEventTouchUpInside];

[_btnsetImage:[UIImageimageNamed:@"dropdownmnue"]forState:UIControlStateNormal];

_btn.layer.cornerRadius=3;

_btn.layer.masksToBounds=YES;

_btn.backgroundColor= [UIColorredColor];

}

return_btn;

}

- (instancetype)init

{

self= [superinit];

if(self) {

[selfinitSetUp];

[selfaddNotificationKeyBoard];

[selfcreatBtn];

}

returnself;

}

-(void)setDelegate:(id)delegate{

_delegate= delegate;

/*

获取view的原始位置

*/

[selfviewAction:^(UIView*view) {

originalY= view.y;

}];

}

/*

添加键盘监听

*/

-(void)addNotificationKeyBoard{

[[NSNotificationCenterdefaultCenter]addObserver:self

selector:@selector(keyBoardShow:)

name:UIKeyboardWillShowNotificationobject:nil];

[[NSNotificationCenterdefaultCenter]addObserver:self

selector:@selector(keyBoardHidden:)

name:UIKeyboardWillHideNotificationobject:nil];

}

/**

*创建取消键盘的按钮

*/

-(void)creatBtn{

[[UIApplicationsharedApplication].keyWindowaddSubview:self.btn];

}

-(void)initSetUp{

self.isSuitable=YES;

self.isShowDownBtn=YES;

}

-(void)setIsShowDownBtn:(BOOL)isShowDownBtn{

_isShowDownBtn= isShowDownBtn;

self.btn.hidden= !isShowDownBtn;

}

-(void)downKeyBoard:(UIButton*)button{

[selfviewAction:^(UIView*view) {

[viewendEditing:YES];

}];

if(_delegate&& [_delegaterespondsToSelector:@selector(WindyKeyBoardBtnClick:)]) {

[_delegateWindyKeyBoardBtnClick:button];

}

}

/**

*键盘升起

*/

-(void)keyBoardShow:(NSNotification*)notifi{

floatheight = [[notifi.userInfoobjectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue].size.height;

_btn.x=WD-_btn.wide;

[UIViewanimateWithDuration:0.23animations:^{_btn.y=HG- height -_btn.height;}];

[selfsetTextFieldLocation:heightupOrDown:YES];

if(_delegate&& [_delegaterespondsToSelector:@selector(WindyKeyBoard:withNotification:)]) {

[_delegateWindyKeyBoard:YESwithNotification:notifi];

}

}

-(void)setTextFieldLocation:(CGFloat)kHeight upOrDown:(BOOL)isUp{

if(_isSuitable) {

[selfviewAction:^(UIView*view) {

UITextField*textField = [selffindFirstResponder:view];

if(isUp) {//键盘升起- view向上偏移

CGRectrect = [textFieldconvertRect:textField.boundstoView:[UIApplicationsharedApplication].keyWindow];

CGFloatlocationY =CGRectGetMaxY(rect);

if( locationY >HG- kHeight) {

[UIViewanimateWithDuration:0.23animations:^{

view.y= view.y- (rect.origin.y+ rect.size.height+ kHeight -HG);

}];

}

}

else{//键盘隐藏-还原到初始位置

[UIViewanimateWithDuration:0.23animations:^{

view.y=originalY;

}];

}

}];

}

}

-(void)keyBoardHidden:(NSNotification*)notifi{

floatheight = [[notifi.userInfoobjectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue].size.height;

[UIViewanimateWithDuration:0.23animations:^{

_btn.y=HG;

}];

[selfsetTextFieldLocation:heightupOrDown:NO];

if(_delegate&& [_delegaterespondsToSelector:@selector(WindyKeyBoard:withNotification:)]) {

[_delegateWindyKeyBoard:NOwithNotification:notifi];

}

}

/**

*返回view

*使用block操作不同情况

*/

-(void)viewAction:(void(^)(UIView*))block{

if([_delegateisKindOfClass:[UIViewControllerclass]]) {

UIViewController*ctl = (UIViewController*)_delegate;

if(block) block(ctl.view);

}

elseif([_delegateisKindOfClass:[UIViewclass]]){

UIView*view = (UIView*)_delegate;

if(block) block(view);

}

}

/*

找出当前响应的TextField

*/

-(UITextField*)findFirstResponder:(UIView*)view

{

if(view.isFirstResponder) {

return(UITextField*)view;

}

for(UIView*subViewinview.subviews) {

UIView*firstResponder = [selffindFirstResponder:subView];

if(firstResponder !=nil) {

return(UITextField*)firstResponder;

}

}

returnnil;

}

@end





最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现cl...
    以德扶人阅读 2,350评论 2 50
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,486评论 1 14
  • 这篇文章会对 IQKeyboardManager 自动解决键盘遮挡问题的方法进行分析。 最近在项目中使用了 IQK...
    MissLu16阅读 2,495评论 0 4
  • 独立荒野倾盆的秋雨 努力寻找蛙鸣 陪伴孤寂和胆怯 欢快如汩汩的水泡 梦幻鼓起又破裂 水帘后 闭上眼睛吧 睁开时 天...
    静铃音阅读 534评论 28 56
  • 这个夜晚过后 当你一步步的走近,走近 我以为 可以牵起你的手,将我 内心的积雪融化,我们一起走进春天 而火焰燃尽,...
    Z无尾鱼阅读 242评论 1 4