键盘显示,不会解雇

时间:2014-06-16 23:52:46

标签: ios keyboard uitextfield uiviewanimation first-responder

我有一个包含多个UITextfields的视图,当我快速点击并在UITextFields中随机输入时,一段时间后我进入键盘显示但不会被忽略的状态。按右下方"关闭键盘"按钮不起作用。键盘上的所有按键仍会发出咔哒声,按下时会变为灰色。

在根视图控制器中,我观察所有键盘隐藏和显示事件。

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShowWithNotification:) 
name:UIKeyboardDidShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidHideWithNotification:) 
name:UIKeyboardDidHideNotification object:nil];

- (void)keyboardDidShowWithNotification:(NSNotification *)aNotification
{
    DataViewController* theCurrentController = (DataViewController*)self.pageViewController.viewControllers[0];
    float yCoord;
    UITextField* text = (UITextField*)[self findFirstResponder:theCurrentController.view];
    if(text.frame.origin.y < 10)
         yCoord = text.superview.frame.origin.y;
    else
         yCoord = text.frame.origin.y;

    NSLog(@"%f",yCoord);
    if(yCoord > 410)
        offCenter = 230;
    else if (yCoord > 240)
        offCenter = 150;

    if(offCenter > 0)
        [UIView animateWithDuration:0.3 
delay:0                           options:UIViewAnimationCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         CGPoint adjust = CGPointMake(0, -1*offCenter);
                         CGPoint newCenter = CGPointMake(self.pageViewController.view.center.x+adjust.x, self.pageViewController.view.center.y+adjust.y);
                         [self.pageViewController.view setCenter:newCenter];
                     }
                     completion:nil];

}


- (void)keyboardDidHideWithNotification:(NSNotification *)aNotification
{
    if(offCenter)
    {
    [UIView animateWithDuration:0.3  delay:0 options:UIViewAnimationCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         CGPoint adjust = CGPointMake(0, offCenter);

                         CGPoint newCenter = CGPointMake(self.pageViewController.view.center.x+adjust.x, self.pageViewController.view.center.y+adjust.y);
                         [self.pageViewController.view setCenter:newCenter];

                     }
                     completion:nil];
}
offCenter = 0;
}

当键盘显示时,如果键盘隐藏了第一个响应者,我将视图设置为动画,以便用户可以看到UITextField。当键盘隐藏时,如果视图位于高位,则返回到中心。

在ViewController本身实现一个UITapGestureRecognizer

 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                               initWithTarget:self
                               action:@selector(dismissKeyboard)];

-(void)dismissKeyboard {
    [self.heartRateTextField resignFirstResponder];
    [self.systolicBPTextField resignFirstResponder];
    [self.diastolicBPTextField resignFirstResponder];
}

当点击发生时,我在所有UITextFields上使用resignFirstResponder。

ViewController也是一个实现以下

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

- (BOOL) textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)textEntered {
    if(([textEntered intValue] && textField.text.length < 3) || [textEntered  isEqualToString:@""] || ([textEntered isEqualToString:@"0"] && textField.text.length > 0 && textField.text.length < 3))
    return YES;
        else
    return NO;
}

即使返回按钮和键盘上的所有其他键仍处于活动状态,这两个事件句柄中的断点也不会触发。我可以点击它们,然后它们变成灰色。

当视图未处于此错误状态时,所有这些都有效。只有在随机点击和键入后,视图才会停止响应,并且不会触发这些事件。此错误状态仅发生在键盘隐藏UITextField并需要动画的页面上。此错误状态仅在视图居中时发生,从不在高时发生。仅在键盘隐藏线下方和键盘隐藏线上方的UITextField之间点击时,才会出现此错误状态。

要转义错误状态,只需点击可见的UITextField即可。 UITextField成为第一个响应者,现在所有事件都正常工作。

关于为什么会发生这种情况或如何调试此问题的任何想法?感谢。

1 个答案:

答案 0 :(得分:0)

这对我来说有点问题:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                              initWithTarget:self
                              action:@selector(dismissKeyboard)];

您应该尝试制作目标self.view

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] 
                              initWithTarget:self.view
                              action:@selector(dismissKeyboard)];

如果这不能解决问题,我会创建一个空白UIButton,它位于视图控制器上所有其他UI元素的下方,并将UITapGestureRecognizer的目标指定给该按钮。