繁体   English   中英

为UITextField设置动画时的奇怪行为

[英]Strange behavior when animating UITextField

我正在尝试为UITextField设置动画,但是我却被一个烦人而又奇怪的问题所困扰。 我的动画具有以下顺序:

第一状态

在第一种状态下,应用程序在未显示的摄像头按钮之后具有UITextField ,摄像头UIButton和取消UIButton ,因为其位置超出了应用程序的限制。 实际上,我的应用程序的宽度为320,取消按钮的原点为(350,7)

第二状态

在第二种状态下,当用户触摸UITextField ,相机按钮的alpha通道设置为0,取消按钮的原点设置为(247,7)。

最终状态

用户触摸键盘的“返回”按钮或“取消”按钮后的最终状态与第一状态相同。

在处理期间,将对UITextField宽度和x轴上的“取消”按钮原点进行动画处理。

我的代码是:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
  barcodeSearchButton.userInteractionEnabled = NO;
  cancelButton.userInteractionEnabled = NO;

   CGFloat cancelButtonXOffset = CGRectGetMaxX(barcodeSearchButton.frame) - cancelButton.frame.size.width;
   CGFloat searchFieldWidth = searchField.frame.size.width - cancelButton.frame.size.width + barcodeSearchButton.frame.size.width;
   [UIView animateWithDuration:0.3
         animations:^{
             searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldWidth, searchField.frame.size.height);
             cancelButton.alpha = 1.0;                
             cancelButton.frame = CGRectMake(cancelButtonXOffset, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height);

             barcodeSearchButton.alpha = 0.0;

         }
         completion:^(BOOL finished) {
             barcodeSearchButton.userInteractionEnabled = NO;
             cancelButton.userInteractionEnabled = YES;
         }];    
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
  barcodeSearchButton.userInteractionEnabled = NO;
  cancelButton.userInteractionEnabled = NO;

  [UIView animateWithDuration:0.3
                 animations:^{
                     searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldStartWidth, searchField.frame.size.height);
                     cancelButton.alpha = 0.0;
                     cancelButton.frame = CGRectMake(cancelButtonStartX, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height);
                     barcodeSearchButton.alpha = 1.0;                
                 }
                 completion:^(BOOL finished) {
                     barcodeSearchButton.userInteractionEnabled = YES;
                     cancelButton.userInteractionEnabled = NO;
                 }];        
}

当动画第一次执行直到直到最终状态时,这意味着用户触摸了UITextField,WROTE DOWN(此部分很重要)在字段上显示了一些文本,然后用户触摸了键盘返回按钮,便出现了问题。 问题在于,当UITextField的宽度也被动画化时,UITextField中的键入文本也会被动画化。

动画的行为像下面这样:

  1. UITextField延伸回其初始值。
  2. 取消按钮返回到其初始位置
  3. 相机按钮设置为1.0
  4. 键入的文本从UITextField左上角飞过,并落入UITextfield到达的位置。

问题是步骤4不应该发生,而问题是它只发生一次。 如果再次开始该过程(触摸uitextfield,键入一些文本,触摸返回键),则不会发生步骤4。

我花了整整一天的时间来尝试解决此问题,但未成功。

感谢大家的答复,但我早已找到了解决方案。 根据键盘状态,在UITextField启动动画的正确方法是重写textFieldShouldBeginEditingtextFieldShouldEndEditing方法。

我的第一次尝试是重写textFieldDidBeginEditingtextFieldDidEndEditing来创建动画。 我不知道原因在动画工作textFieldShouldBeginEditingtextFieldShouldEndEditing但不是在textFieldDidBeginEditingtextFieldDidEndEditing 但这是可行的。

我的修订代码版本:

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

    CGFloat cancelButtonXOffset = CGRectGetMaxX(barcodeSearchButton.frame) -    cancelButton.frame.size.width;
    CGFloat searchFieldWidth = searchField.frame.size.width - cancelButton.frame.size.width + barcodeSearchButton.frame.size.width;
    [UIView animateWithDuration:0.3
         animations:^{
             searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldWidth, searchField.frame.size.height);
             cancelButton.alpha = 1.0;                
             cancelButton.frame = CGRectMake(cancelButtonXOffset, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height);

             barcodeSearchButton.alpha = 0.0;

         } completion:^(BOOL finished) {
             searchField.clearButtonMode = UITextFieldViewModeAlways;
         }]; 
    return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    [UIView animateWithDuration:0.3
         animations:^{
             searchField.frame = CGRectMake(searchField.frame.origin.x, searchField.frame.origin.y, searchFieldStartWidth, searchField.frame.size.height);
             cancelButton.alpha = 0.0;
             cancelButton.frame = CGRectMake(cancelButtonStartX, cancelButton.frame.origin.y, cancelButton.frame.size.width,cancelButton.frame.size.height);
             barcodeSearchButton.alpha = 1.0;                
         } completion:^(BOOL finished) {
             searchField.clearButtonMode = UITextFieldViewModeNever;
         }];
   return YES;
}

在搜索字段_searchField.text = @“ placeholder”上设置一些占位符文本

并设置_searchField.clearsOnBeginEditing = YES;

或者,您可以清除值是否等于textDidBeginEditing上的占位符文本

{编辑以改进此修复程序}我也有同样的问题,还有更多详细信息以及确实为我修复了一个小技巧。

所以首先是更多细节:

  1. 仅在框架动画第一次扩展UITextField并在字段中输入文本时才会出现此问题。 如果再次编辑UITextField ,并且再次发生相同的动画,则不会发生此问题。
  2. searchField.clearsOnBeginEditing = YES; 不能解决问题。
  3. 在观察到问题的整个过程中,我一直在使用占位符文本。 它对结果没有影响。
  4. 更改一帧的text属性确实可以解决问题。

这是我正在解决的问题:

在我的viewDidLoad我将text属性设置为一个空格,然后将一次分配分配给一个空字符串。

-(void)viewDidLoad {
    searchField.text = @" ";
    dispatch_async(dispatch_get_main_queue(), ^{
        searchField.text = @"";
    });
}

然后,在缩小和扩展UITextField方法以及在屏幕上移动取消按钮的方法中,我检查这是否是瞬时动画,并将持续时间设置为0.0f。

- (void)showCancelButton {
    NSTimeInterval duration = 0.3f;

    [UIView animateWithDuration:duration animations:^{ 
        CGPoint buttonOrigin = cancelButton.frame.origin;
        CGSize buttonSize = cancelButton.frame.size;
        CGFloat buttonTravelDist = buttonSize.width + 10.0f;
        CGPoint onscreenPos = CGPointMake(buttonOrigin.x - buttonTravelDist, buttonOrigin.y);

        cancelButton.frame = CGRectMake(onscreenPos.x, onscreenPos.y, buttonSize.width, buttonSize.height);

        CGPoint fieldOrigin = searchField.frame.origin;
        CGSize fieldSize = searchField.frame.size;

        searchField.frame = CGRectMake(fieldOrigin.x, fieldOrigin.y, fieldSize.width - buttonTravelDist, fieldSize.height);
    }];
}

- (void)hideCancelButton {
    NSTimeInterval duration = 0.3f;

    [UIView animateWithDuration:duration animations:^{ 
        CGPoint buttonOrigin = cancelButton.frame.origin;
        CGSize buttonSize = cancelButton.frame.size;
        CGFloat buttonTravelDist = buttonSize.width + 10.0f;
        CGPoint onscreenPos = CGPointMake(buttonOrigin.x + buttonTravelDist, buttonOrigin.y);

        cancelButton.frame = CGRectMake(onscreenPos.x, onscreenPos.y, buttonSize.width, buttonSize.height);

        CGPoint fieldOrigin = searchField.frame.origin;
        CGSize fieldSize = searchField.frame.size;

        searchField.frame = CGRectMake(fieldOrigin.x, fieldOrigin.y, fieldSize.width + buttonTravelDist, fieldSize.height);
    }];
}

这完全为我解决了这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM