iOS的心路里程

iOS -UITextField/UITextView之键盘遮挡

2017-12-05  本文已影响4人  罂粟之城

大多的解决办法如下所述:


法 1. 将整个界面上的控件和view视图都添加到UIScrollView滑动视图中,然后由UIScrollView控件实现可以上下滑动从而输入框不被软键盘覆盖遮挡。
法 2. 通过一个通知 UIKeyboardDidShowNotification 去实现的,需要用到事件监听,而且需要自己定义并实现“将要开始编辑”与“结束编辑”这两个监听事件中的方法。
法 3. 当出现键盘和关闭键盘的时候视图向上或向下移动一定距离可以使所见视图不被遮挡。

当然方法很多,上面的具体操作,这里不贴出可以mark的代码。还将进一步mark出下面的解决方法和代码。
一、第一种解决方法,代码如下:
   //开始编辑输入框的时候,软键盘出现,执行此事件 
  //这是在使用textField的时候调用textField.delegate = self;调用代理,自动进入这个方法
 -(void)textFieldDidBeginEditing:(UITextField *)textField 
    { 
        CGRect frame = textField.frame; 
//改进方法:CGRect frame = [textField convertRect:textField.frame toView:self.view];
//否则的话对于textField是嵌套在别的view中的情况,self.view上移幅度不够
        int offset = frame.origin.y + 32 - (self.view.frame.size.height - 216.0-35.0); //键盘高度216,键盘上的toolBar高度为35;textField高度32,如果这个控件位于另一个视图上还需要加上父视图的Y值,才可以是需要的偏移量。          
        NSTimeInterval animationDuration = 0.30f; 
        [UIView beginAnimations:@"ResizeForKeyboard" context:nil]; 
        [UIView setAnimationDuration:animationDuration];          
//将视图的Y坐标向上移动offset个单位,以使下面腾出地方用于软键盘的显示 
        if(offset > 0) 
          self.view.frame = 
            CGRectMake(0.0f, -offset, self.view.frame.size.width,self.view.frame.size.height);          
        [UIView commitAnimations]; 
    }      

//当在键盘上按下return键或者按回车键,使得keyboard软键盘消失

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
    { 
        [textField resignFirstResponder]; 
        return YES; 
    }      

//输入框编辑完成以后,将视图恢复到原始状态

-(void)textFieldDidEndEditing:(UITextField *)textField 
    { 
        self.view.frame =CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); 
    }  
二、 第二种解决方法,代码如下:
 1. 首先在.h中使用<UITextFieldDelegate>代理协议,或者在.m的类扩展中使用<UITextFieldDelegate>UITextField控件代理协议

 2. 添加文本输入框控件,在@interface 类扩展中声明两个属性:
        @property (nonatomic, weak) UITextField * userNameText;
        @property (nonatomic, weak) UITextField * userPwdText;
        
 3. 添加实现布局UITextField控件. 
        UITextField * userNameText = [AutolayoutView autolayoutTextFieldWithPlaceholder:@"账号"];
        userNameText.delegate = self;
        [self.view addSubview:userNameText];
        self.userNameText = userNameText;
        UITextField * userPwdText = [AutolayoutViewautolayoutTextFieldWithPlaceholder:@"密码"];
        userPwdText.delegate = self;
        [self.view addSubview:userPwdText];
        self.userPwdText = userPwdText;

 4. 实现相应协议代理方法
            此处主要解决:
    // 当前点击textfield的坐标的Y值 + 当前点击textFiled的高度 - (屏幕高度- 键盘高度 - 键盘上tabbar高度)
    // 在这一步就是这个当前textFiled的的最大Y值和键盘的最全高度的差值,用来计算整个view的偏移量
        
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
        NSLog(@"textFieldDidBeginEditing");
        CGRect frame = textField.frame;
        CGFloat heights = self.view.frame.size.height;
// 当前点击textField的坐标的Y值 + 当前点击textFiled的高度 - (屏幕高度- 键盘高度 - 键盘上tabbar高度)
// 在这一步就是这个当前textFiled的的最大Y值和键盘的最全高度的差值,用来计算整个view的偏移量
        int offset = frame.origin.y + 42- ( heights - 216.0-35.0);//键盘高度216
        NSTimeInterval animationDuration = 0.30f;
        [UIView beginAnimations:@"ResizeForKeyBoard" context:nil];
        [UIView setAnimationDuration:animationDuration];
        float width = self.view.frame.size.width;
        float height = self.view.frame.size.height;
        if(offset > 0)
        {
            CGRect rect = CGRectMake(0.0f, -offset,width,height);
            self.view.frame = rect;
        }
        [UIView commitAnimations];
}
    
 5. 点击空白处的时候让其回到原来位置
        /**
        *  textField 取消选中状态
        */
                    
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
        NSLog(@"touchesBegan");
        [self.view endEditing:YES];
        NSTimeInterval animationDuration = 0.30f;
        [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
        [UIView setAnimationDuration:animationDuration];
        CGRect rect = CGRectMake(0.0f, 0.0f, self.view.frame.size.width, self.view.frame.size.height);
        self.view.frame = rect;
        [UIView commitAnimations];
}
                    
 6. 还有点击键盘的return键的时候恢复原状就要在
                        
- (BOOL)textFieldShouldReturn:(UITextField *)textField;此方法里面处理。
切记一定要判断当前的textFiled是否是你点击的self.userNameText了。在让他恢复原状。
我是只授之以渔的罂粟花,如果您有更好的使用方法欢迎留言交流!
上一篇下一篇

猜你喜欢

热点阅读