簡體   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