[英]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中的键入文本也会被动画化。
动画的行为像下面这样:
UITextField
延伸回其初始值。 UITextField
左上角飞过,并落入UITextfield
到达的位置。 问题是步骤4不应该发生,而问题是它只发生一次。 如果再次开始该过程(触摸uitextfield,键入一些文本,触摸返回键),则不会发生步骤4。
我花了整整一天的时间来尝试解决此问题,但未成功。
感谢大家的答复,但我早已找到了解决方案。 根据键盘状态,在UITextField
启动动画的正确方法是重写textFieldShouldBeginEditing
和textFieldShouldEndEditing
方法。
我的第一次尝试是重写textFieldDidBeginEditing
和textFieldDidEndEditing
来创建动画。 我不知道原因在动画工作textFieldShouldBeginEditing
和textFieldShouldEndEditing
但不是在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;
}
在搜索字段_searchField.text = @“ placeholder”上设置一些占位符文本
并设置_searchField.clearsOnBeginEditing = YES;
或者,您可以清除值是否等于textDidBeginEditing上的占位符文本
{编辑以改进此修复程序}我也有同样的问题,还有更多详细信息以及确实为我修复了一个小技巧。
所以首先是更多细节:
UITextField
并在字段中输入文本时才会出现此问题。 如果再次编辑UITextField
,并且再次发生相同的动画,则不会发生此问题。 searchField.clearsOnBeginEditing = YES;
不能解决问题。 这是我正在解决的问题:
在我的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.