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的行为如下:
-
UITextField
伸展回初始值。 - 取消button返回到其初始原点
- 相机button被设置为1.0
- input的文本从
UITextField
左上angularUITextfield
,它落入UITextfield
到它不应该走的位置。
问题是第四步不应该发生,问题只发生一次。 如果再次启动过程(触摸uitextfield,键入一些文本,触摸返回键)第4步不会发生。
我花了一天的时间试图解决这个问题,但我没有成功。
感谢大家的回答,但是我前一段时间已经find了解决scheme。 根据键盘状态,在UITextField
启动animation的正确方法是覆盖方法textFieldShouldBeginEditing
和textFieldShouldEndEditing
。
我第一次尝试重写textFieldDidBeginEditing
和textFieldDidEndEditing
来创buildanimation。 我不知道在textFieldShouldBeginEditing
和textFieldShouldEndEditing
animation工作的原因,但不在textFieldDidBeginEditing
和textFieldDidEndEditing
。 但它只是工作。
我修改的代码版本:
- (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上的占位符文本,则可以清除该值
{编辑,以改善修复}我有这个完全相同的问题,一些进一步的细节以及一个小的黑客,确实为我修复它。
所以首先进一步的细节:
- 只有在框架animation首次扩展
UITextField
并且在该字段中input文本时才会出现问题。 如果再次编辑UITextField
,并再次发生相同的animation,则问题不会发生。 -
searchField.clearsOnBeginEditing = YES;
不清楚问题。 - 整个过程中,我一直在使用占位符文本。 它对结果没有影响。
- 更改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); }]; }
这已经完全解决了我的情况。