2011-11-10 16 views
5

Próbuję ożywić UITextField, ale zostałem złapany przez irytujący i dziwny problem. Moja animacja ma następującą sekwencję:Dziwne zachowanie podczas animowania UITextField

first state

W pierwszym stanie aplikacja ma UITextField, aparat UIButton i anuluj UIButton po naciśnięciu przycisku aparatu, który nie jest już pokazał, ponieważ jest już umieszczony na granicach wniosku. Właściwie moja aplikacja ma 320 szerokości i anuluj pochodzenie jest (350,7)

second state

W drugim stanie, gdy dotyka użytkownika na UITextField, kamera kanał alfa przycisk jest ustawiony na 0, a pochodzenie przycisk anulowania ustawiony jest na (247,7).

final state

Stan końcowy jest taki sam jak pierwszy stan przycisku użytkownik po dotknięciu przycisku Przejdź klawiatury lub anulować.

Podczas procesu szerokość UITextField i przycisk rozpoczęcia anulowania na osi X są animowane.

Mój kod to:

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

Gdy animacja jest wykonywany aż do ostatecznego stan tylko po raz pierwszy, co oznacza, użytkownik dotknął UITextField, zapisałem (ta część jest ważna) jakiś tekst w polu a następnie użytkownik dotknął przycisku powrotu klawiatury, pojawia się problem. Problem polega na tym, że tekst pisany w UITextField jest animowany, gdy szerokość UITextField jest również animowana.

animacja zachowuje się jak poniżej:

  1. W UITextField sięga do jego wartości początkowej.
  2. przycisk Anuluj plecami do swojego pierwotnego pochodzenia
  3. przycisk aparatu jest ustawiony na 1,0
  4. wpisywanych tekst leci z lewego górnego rogu UITextField i ląduje w UITextfield na stanowisku, że nie należy poszły.

Problem polega na tym, że krok 4 nie powinien się zdarzyć, a problem występuje tylko raz. Jeśli ponownie rozpoczniesz proces (dotknij pola uitext, wpisz tekst, dotknij klawisza powrotu), krok 4 nie nastąpi.

Spędzam cały dzień próbując rozwiązać ten problem, ale nie udało mi się.

Odpowiedz

0

Ustaw tekst zastępczy w polu wyszukiwania, _searchField.text = @ "zastępczy"

a także ustawić _searchField.clearsOnBeginEditing = YES;

Albo można po prostu jasne z wartości, jeśli jest równa tekstu zastępczego na textDidBeginEditing

+0

Ponadto, za pomocą tekstu zamiast właściwości tekstu zastępczego może bałagan ze swoimi kolorami, więc trzeba będzie ustalić, że aż tak dobrze. –

0

{edytowany poprawić poprawkę} mam dokładnie ten sam problem, i kilka dalszych szczegółów, jak również niewielka hack, który naprawia to dla mnie.

Więc najpierw dalsze szczegóły:

  1. Problem występuje tylko przy pierwszym animacja rama rozszerza się UITextField i nie jest wpisany tekst w polu. Jeśli numer zostanie ponownie edytowany i nie powtórzy się ta sama animacja, problem nie wystąpi.
  2. searchField.clearsOnBeginEditing = YES; nie usuwa problemu.
  3. Używałem tekstu zastępczego przez cały czas, kiedy zaobserwowano problem z . Nie ma wpływu na wyniki.
  4. Zmiana właściwości tekstu dla 1 klatki ma wpływ na usunięcie problemu.

Oto co robie to naprawić:

w moim viewDidLoad ja ustawienie właściwości tekst do jednego miejsca, a następnie wysyłając raz zadanie na pusty ciąg.

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

Następnie w moich metod, które kurczą się i rozszerzają UITextField, jak przenieść przycisk Anuluj na ekranie, to sprawdzić, czy jest to chwilowa animacji i ustawić czas do 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); 
    }]; 
} 

To całkowicie naprawiło sytuację.

6

Dzięki za odpowiedzi wszystkich, ale znalazłem rozwiązanie jakiś czas temu. Prawidłowym sposobem rozpoczęcia animacji w trybie UITextField, w zależności od stanu klawiatury, jest przesłanianie metod textFieldShouldBeginEditing i textFieldShouldEndEditing.

Moja pierwsza próba nadpisania textFieldDidBeginEditing i textFieldDidEndEditing do tworzenia animacji. Nie znam powodu dla animacji w textFieldShouldBeginEditing i textFieldShouldEndEditing, ale nie w textFieldDidBeginEditing i textFieldDidEndEditing. Ale to po prostu działa.

Moja wersja poprawiona Kod:

- (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; 
} 
+0

To działa dobrze. Naprawiono inny problem związany z animowaniem UITextFields podczas używania UIControlEventEditingDidEnd. Przełączono na tę konfigurację i animacje zostały naprawione. – jasonjwwilliams

+0

To już nie działa w iOS 8.1 (przynajmniej). –