animationUITextField时出现奇怪的行为

我试图animation一个UITextField但我已经被一个恼人的和奇怪的问题抓住。 我的animation有以下顺序:

第一个状态

在第一种状态下,应用程序具有UITextField ,相机UIButton和取消UIButton后,相机button没有显示,因为它已被定位超出了应用程序的限制。 其实我的应用程序有320的宽度和取消button原点是(350,7)

第二状态

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

最终状态

用户触摸键盘上的返回button或取消button后,最终状态与第一个状态相同。

在处理过程中,X轴上的UITextField宽度和取消button原点是animation的。

我的代码是:

 - (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; }]; } 

当animation执行到第一次的最终状态时,也就是说,用户触摸了UITextField,WROTE DOWN(这部分很重要)一些文本,然后用户触摸了键盘上的返回button,问题就出现了。 问题是当UITextField的宽度也是dynamic的时,UITextField中的input文本是animation的。

animation的行为如下:

  1. UITextField伸展回初始值。
  2. 取消button返回到其初始原点
  3. 相机button被设置为1.0
  4. input的文本从UITextField左上angularUITextfield ,它落入UITextfield到它不应该走的位置。

问题是第四步不应该发生,问题只发生一次。 如果再次启动过程(触摸uitextfield,键入一些文本,触摸返回键)第4步不会发生。

我花了一天的时间试图解决这个问题,但我没有成功。

感谢大家的回答,但是我前一段时间已经find了解决scheme。 根据键盘状态,在UITextField启动animation的正确方法是覆盖方法textFieldShouldBeginEditingtextFieldShouldEndEditing

我第一次尝试重写textFieldDidBeginEditingtextFieldDidEndEditing来创buildanimation。 我不知道在textFieldShouldBeginEditingtextFieldShouldEndEditinganimation工作的原因,但不在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; } 

在search字段中设置一些占位符文本,_searchField.text = @“placeholder”

并设置_searchField.clearsOnBeginEditing = YES;

或者,如果它等于textDidBeginEditing上的占位符文本,则可以清除该值

{编辑,以改善修复}我有这个完全相同的问题,一些进一步的细节以及一个小的黑客,确实为我修复它。

所以首先进一步的细节:

  1. 只有在框架animation首次扩展UITextField并且在该字段中input文本时才会出现问题。 如果再次编辑UITextField ,并再次发生相同的animation,则问题不会发生。
  2. searchField.clearsOnBeginEditing = YES; 不清楚问题。
  3. 整个过程中,我一直在使用占位符文本。 它对结果没有影响。
  4. 更改1帧的文本属性确实有清除问题的效果。

这是我正在做的事情来解决它:

在我的viewDidLoad我将text属性设置为一个空格,然后将一个赋值指派给一个空string。

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

然后在缩小和展开UITextField ,以及在屏幕上移动一个取消button,我检查这是否是一个瞬间animation,并将持续时间设置为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); }]; } 

这已经完全解决了我的情况。