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

Posted

技术标签:

【中文标题】UITextField 清除按钮与屏幕动画一起使用【英文标题】:UITextField clear button use with screen animation 【发布时间】:2014-09-02 22:38:52 【问题描述】:

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

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)
                     ];

【问题讨论】:

你的textFieldShouldBeginEditing没有返回值? 抱歉,复制/粘贴错误,已修复帖子。该方法甚至不需要存在,我只是在调试时将其放入,因此通过代码跟踪并查看以确保正确遵循它的顺序。 【参考方案1】:

我怀疑第一个 textFieldShouldEndEditingtextFieldDidEndEditing 是通过按下清除按钮触发的。 textFieldShouldClear 是由修饰触发的。但是对于您的动画,textField 在触摸后立即移动,因此触摸不会注册。尝试使用 textField didEndOnExit 事件来触发执行动画的方法。

【讨论】:

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

以上是关于UITextField 清除按钮与屏幕动画一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 出现清除按钮时禁用文本移位

UITextField 清除按钮调用 didEndEditing 两次

将 UITextfield“清除”默认按钮连接到 UILabel

布局 UITextField 无论清除按钮 X

自定义 UITextField 清除按钮

UITextField 文本重叠清除按钮