[英]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.