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;
}
}
浙公网安备 33010602011771号