UITextField清除按钮与屏幕动画一起使用

问题描述:

当用户输入文本字段时,我有一个屏幕可以执行动画(向上移动屏幕),以便在输入数据时保持可见状态,然后在用户输入数据后切换回来。我遇到的问题是当用户尝试使用文本框内的清除按钮(使用site_TextField.clearButtonMode = UITextFieldViewModeAlways进行设置)。文本字段中的流时,清除按钮被按下应该是:UITextField清除按钮与屏幕动画一起使用

textFieldShouldEndEditing - > textFieldDidEndEditing - > textFieldShouldClear - > textFieldShouldBeginEditing - > textFieldDidBeginEditing

然而,textFieldDidEndEditing方法,其中动画是在执行动画时调用,上面的序列停止,并且不调用textFieldShouldClear。我希望这是简单的,我只是想念。任何输入是赞赏!

- (BOOL)textFieldShouldBeginEditing:(UITextField *) textField 
{ 
    NSLog(@"In textFieldShouldBeginEditing"); 
    return YES; 
} 

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    if (textField == site_TextField || textField == phone_TextField) { 
     [self animateTextField: textField up: YES]; 
    } 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    NSLog(@"In textFieldShouldEndEditing"); 
    return YES; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    if (textField == site_TextField || textField == phone_TextField) { 
     [self animateTextField: textField up: NO]; 
    } 
} 

- (BOOL)textFieldShouldClear:(UITextField *)textField { 

    NSLog(@"In textFieldShouldClear"); 
    return YES; 
} 

- (void) animateTextField: (UITextField*) textField up: (BOOL) up 
{ 
    if (textField != site_TextField && textField != phone_TextField) { 
     return; 
    } 

    int movementDistance = 0; 
    if (textField == site_TextField) { 
     movementDistance = 100; 
    } else if (textField == phone_TextField) { 
     movementDistance = 170; 
    } 

    int movement = (up ? -movementDistance : movementDistance); 

    [UIView animateWithDuration:0.3 
          delay:0.0 
         options: UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         self.view.frame = CGRectOffset(self.view.frame, 0, movement); 
        } 
        completion:^(BOOL finished){ 
        }]; 
} 
+0

你的'textFieldShouldBeginEditing'没有返回值? – pbasdf 2014-09-02 22:47:42

+0

对不起,复制/粘贴错误,修复了帖子。这个方法甚至不需要在那里,我只是在调试的时候把它放进去,通过代码跟踪,看看按照什么顺序来确保我正确地跟踪它。 – 2014-09-03 03:04:40

我怀疑第一textFieldShouldEndEditingtextFieldDidEndEditing通过触摸向下清除按钮触发。触摸起来触发textFieldShouldClear。但在动画中,textField会在触摸后立即移动,因此触摸不会进行注册。尝试使用textField didEndOnExit事件来触发动画关闭的方法。

+0

这确实让我接近我想做的事(我从委托实现了textFieldShouldReturn,但我相信它们都是由同一个事件触发的)。我还使用手势识别器来结束编辑,并且还必须从手势识别器的目标中调用动画代码。 – 2014-09-04 01:47:53