iOS 处理键盘遮挡TextField、TextView问题

  之前处理键盘遮挡问题都是在每一个控制器进行单独处理,这样做真的是非常的费事,今天在做项目的时候就想到自己封装一个,记录一下这个“跌宕起伏”的过程。

  思路是这样的:计算文本编辑控件Frame与键盘Frame,如果遮挡则移动控制器View。

  创建控制器类:WKAvoidKeyboardViewController

  

 1 #import <UIKit/UIKit.h>
 2
 3 @interface WKAvoidKeyboardViewController : UIViewController
 4
 5 @property (nonatomic, strong) UITextField *editTextField;
 6 @property (nonatomic, strong) UITextView *editTextView;
 7
 8 - (void)hideKeyboard:(NSNotification *)noti;
 9 - (void)showKeyboard:(NSNotification *)noti;
10
11
12 @end
13
14
15 #import "WKAvoidKeyboardViewController.h"
16
17 #define GetOSVersion [[UIDevice currentDevice].systemVersion floatValue]
18
19 #define GetTransformDistance(Distance) (GetOSVersion < 7.1 ? Distance / 2 : Distance)
20
21 @interface WKAvoidKeyboardViewController ()<UITextFieldDelegate, UITextViewDelegate>
22
23 @end
24
25 @implementation WKAvoidKeyboardViewController
26 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
27 {
28     [self.view endEditing:YES];
29 }
30 @end

  步骤1:通过通知获取当前编辑的文本控件

//注册通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showKeyboard:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideKeyboard:) name:UIKeyboardWillHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldBeginEditing:) name:UITextFieldTextDidBeginEditingNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldBeginEditing:) name:UITextViewTextDidBeginEditingNotification object:nil];
- (void)textFieldBeginEditing:(NSNotification *)noti
{
    self.editTextField = noti.object;
    self.editTextView = nil;
}
- (void)textViewBeginEditing:(NSNotification *)noti
{
    self.editTextView = noti.object;
    self.editTextField = nil;
}

  步骤2:通知获取键盘高度

  步骤3:计算是否需要移动

  

#pragma mark - 键盘躲避

- (void)showKeyboard:(NSNotification *)noti
{
    self.view.transform = CGAffineTransformIdentity;
    UIView *editView = _editTextView ? _editTextView : _editTextField;

    CGRect tfRect = [editView.superview convertRect:editView.frame toView:self.view];
    NSValue *value = noti.userInfo[@"UIKeyboardFrameEndUserInfoKey"];
    NSLog(@"%@", value);
    CGRect keyBoardF = [value CGRectValue];

    CGFloat animationTime = [noti.userInfo[@"UIKeyboardAnimationDurationUserInfoKey"] floatValue];
    CGFloat _editMaxY = CGRectGetMaxY(tfRect);
    CGFloat _keyBoardMinY = CGRectGetMinY(keyBoardF);
    NSLog(@"%f %f", _editMaxY, _keyBoardMinY);
    if (_keyBoardMinY < _editMaxY) {
        CGFloat moveDistance = _editMaxY - _keyBoardMinY;
        [UIView animateWithDuration:animationTime animations:^{
            self.view.transform = CGAffineTransformTranslate(self.view.transform, 0, -moveDistance);
        }];

    }
}

- (void)hideKeyboard:(NSNotification *)noti
{
    //    NSLog(@"%@", noti);
    self.view.transform = CGAffineTransformIdentity;
}

  初步试验:UITextFiled成功,然后到了UITextView,坑爹的问题粗线了=.=, UITextViewTextDidBeginEditingNotification 发送时间是在键盘弹出通知之后的,导致第一次点击TextView没有用,点击第二次才能产生效果。于是乎,我又开始尝试用TextView的Delegate来做,想当然的使用的代理方法

- (void)textViewDidBeginEditing:(UITextView *)textView

1 - (void)textViewDidBeginEditing:(UITextView *)textView
2 {
3
4 }

  令人失望的是textViewDidBeginEditing:方法调用依然是在键盘通知弹出后再调用,此时心中想的是:哔了狗了,让人怎么玩!还是看看其他方法吧。于是在代理方法中看到了

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView

  尝试之后,此方法的确在键盘弹出前调用,大功告成,接下来就是设置代理的问题了

  设置代理方法如下:

 1 - (void)searchTextViewWithView:(UIView *)view
 2 {
 3     for (UIView *subview in view.subviews)
 4     {
 5         if ([subview isKindOfClass:[UITextView class]]) {
 6             ((UITextView *)subview).delegate = self;
 7         }
 8         if ([subview isKindOfClass:[UITextField class]]) {
 9             ((UITextField *)subview).delegate = self;
10         }
11         [self searchTextViewWithView:subview];
12     }
13 }

  至此大功告成,使用方法:继承WKAvoidKeyboardViewController,如果是用故事版创建的文本控件,啥都不用做,如果是用代码创建的,则需要在ViewDidLoad中调用searchTextViewWithView方法

  完整代码下载地址:https://github.com/WuKongCoo1/AvoidKeyboardDemo.git

时间: 2024-08-25 22:49:30

iOS 处理键盘遮挡TextField、TextView问题的相关文章

IOS 关于键盘遮挡编辑区域(UITextFiled/UITextView)的问题

参考自:http://blog.csdn.net/windkisshao/article/details/21398521 1.自定方法 ,用于移动视图 -(void)moveInputBarWithKeyboardHeight:(float)_CGRectHeight withDuration:(NSTimeInterval)_NSTimeInterval; 2.注册监听 NSNotificationCenter *defaultCenter = [NSNotificationCenter d

iOS软键盘遮挡UITableView内文本框问题

1.注册 UIKeyboardDidShowNotification/UIKeyboardDidHideNotification通知. -(id) initWithNibName:(NSString*)nibNameOrNil bundle:nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { // 写在这里,或者viewDidLoad [[NSNotificationC

iOS 防止键盘遮挡

开发的朋友也许会经常遇到点击输入框激活出现键盘而导致输入框被遮住的现象,常用的解决方案有两种: 1.键盘出现的时候,将内容页面适当上移 2.键盘出现的时候,漂浮输入框到适当位置 笔者认为 第一种方案比较简单,这里只介绍第一种,第二种类似. 一.首先对键盘事件进行监听设置(可写入viewDidLoad中): //增加监听,当键盘出现或改变时收出消息 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(k

『零行代码』解决键盘遮挡问题(iOS)

关注仓库,及时获得更新:iOS-Source-Code-Analyze https://github.com/draveness/iOS-Source-Code-Analyze Follow: Draveness · Github 这篇文章会对 IQKeyboardManager 自动解决键盘遮挡问题的方法进行分析. 最近在项目中使用了 IQKeyboardManager 来解决 UITextField 被键盘遮挡的问题,这个框架的使用方法可以说精简到了极致,只需要将 IQKeyboardMan

iOS键盘遮挡问题解决办法

iOS开发之“键盘遮挡输入框的解决办法”之一 -----键盘通知之前处理这种问题,总是在触发输入框编辑事件键盘弹出的时候,将当前的View整体向上移动,结束编辑又整体向下移,耗时耗力效率低. 在网上看了使用键盘通知的方法很是方便,所以写了个demo供初学者参考! 1.在ViewController.m文件声明 #import "ViewController.h" @interface ViewController ()<UITableViewDelegate,UITableVie

iOS键盘遮挡输入框,输入区域自动上移

在iOS开发过程当中,遇到关于键盘遮挡输入框的问题,经过网络参考与实践,总结如下: 登录窗口,上下放置两个UITextField,一个用户名,一个密码,放置的在屏幕下方1/3处,当点击用户名时,自动弹出键盘,正好挡住了输入框 解决思路: 1.BLoginViewController 实现UITextViewDelegate的方法 1 //实现了UITextFieldDelegate中的方法,当对TextField进行编辑即键盘弹出时,自动将输入框上移 2 -(BOOL)textFieldShou

IOS开发中滑动视图(UIScrollView, UITableView)的键盘遮挡处理

一.键盘遮挡的场景分类 1. 开始页面录入.输入控件在屏幕的下部,键盘出现后遮挡输入控件 2. 切换焦点.新输入框被当前键盘部分遮挡,可点击 3. 切换输入法. 4. 屏幕旋转.屏幕高度发生变化,原未被遮挡输入框旋转后被遮挡 二.UI需上移的距离计算 计算控件底部与键盘终点顶部的距离,调整阀值自定.通常选择输入控件最近的UIViewController->view作为同一参照 NSDictionary *userInfo = [notification userInfo]; NSValue* a

iOS开发 编辑框被系统弹出的软键盘遮挡问题

我们在开发注冊界面的时候,最后几个注冊条件经常easy被系统弹出的键盘遮挡,例如以下图: 能够看见,邮箱条件被遮挡掉了,怎么解决呢?我是通过UITextField的代理加计算偏移量: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.emailTextField.delegate = self; } - (

IOS控件UITextView 实现placeholder效果和解决UITableView键盘遮挡

平时开发中老是出现多行的文本而且要有placeholder提示,就自己整理项目中部分代码以供参考.讨论,希望有更好实现方法的人多多指教. 思路:通过改变UITextView的文本颜色实现placeholder效果,通过改变UITableView的setContentOffset方法解决键盘遮挡 1.创建UITextView textView = [[UITextViewalloc] init]; textView.font = [UIFontsystemFontOfSize:14]; textV