UITextField 调用的键盘挡住了它自己

在使用UITextField过程中,常常遇到一些可以相似的可以复用的场景,整理如下。

1.键盘挡住了输入框。

 解决方案:在两个委托方法中,将视图上移或者下移,这样

-(void)textFieldDidBeginEditing:(UITextField *)textField 
- (void)textFieldDidEndEditing:(UITextField *)textField

实现view的向上和向下移动。当插入符到textField时,调用了textFieldDidBeginEditing方法。此时将控制器的view向上移动一定距离。纵坐标减少

当插入符离开textField时,调用textFieldDidEndEditing方法。将控制器的view重新恢复到原来的位置。因为对于一个视图体系而言,视图会谁着根视图的移动而同时进行相同的位移。

关键问题是移动多少距离。

实际上移动的距离是计算出来的。键盘高是216,移动距离是 textField底部的纵坐标 - 键盘上部的纵坐标 。其中键盘上部纵坐标是[[UIScreen mainScreen]bounds].size.height - 216

当这个值大于0的时候 说明输入框被挡住了。当小于0的时候,表示无需要移动。所以还需要一个全局变量保存是否产生了移动,便于设置我们是否需要恢复

因此代码实现如下

bool isCenterChanged; //全局变量,初始化设置为NO。

当被遮挡时,视图向上移动一定单位

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGFloat offsetHeight = 0;
    offsetHeight = (textField.frame.origin.y + textField.frame.size.height)- ([UIScreen mainScreen].bounds.size.height - 216);
    if (offsetHeight > 0)
    {
       CGPoint center = self.view.center;
       center.y -= offsetHeight;
       self.view.center = center;
       isCenterChanged = YES;
    }
}

当我们确实有移动后,我们下移动一定单位,如果之前没有移动,我们不进行任何操作

- (void)textFieldDidEndEditing:(UITextField *)textField

{
    CGFloat offsetHeight = 0;
    offsetHeight = (textField.frame.origin.y + textField.frame.size.height)- ([UIScreen mainScreen].bounds.size.height - 216);
    if (isCenterChanged)
    {
        CGPoint center = self.view.center;
        center.y += offsetHeight;
        self.view.center = center;
        isCenterChanged = NO;
    }
}

  

posted on 2014-01-04 22:07  mix1009  阅读(329)  评论(0)    收藏  举报

导航