代码之家  ›  专栏  ›  技术社区  ›  J.D. Mihalko

UITextField清除按钮用于屏幕动画

  •  1
  • J.D. Mihalko  · 技术社区  · 10 年前

    我有一个屏幕,当用户输入文本字段时,它会执行动画(向上移动屏幕),以便在输入数据时保持可见,然后在用户完成输入数据后向下移动。我遇到的问题是,当用户尝试使用文本框内的清除按钮时(设置为site_TextField.clearButtonMode=UITextFieldViewModeAlways)。按下清除按钮时,文本字段的流程应为:

    textFieldShouldEnd编辑-->textFieldDidEndEditing-->text字段应清除-->text字段应开始编辑-->textFieldDid开始编辑

    然而,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){
                         }];
    }
    
    1 回复  |  直到 10 年前
        1
  •  0
  •   pbasdf    10 年前

    我怀疑第一个 textFieldShouldEndEditing textFieldDidEndEditing 通过按下清除按钮触发。以及 textFieldShouldClear 由触摸触发。但是在动画中,textField会在触摸后立即移动,因此触摸不会注册。尝试使用textField didEndOnExit 事件触发一个向下播放动画的方法。