2012-01-17 16 views
5

Jestem w trakcie przewijania UIScrollView w górę, jeśli klawiatura ukryje UITextField. Zmniejszam wysokość UIScrollView, jeśli będzie ona zakryta, co działa dobrze. ale kiedy próbuję zwiększyć wysokość UIScrollView (z powrotem do oryginalnego rozmiaru), cały UIScrollView przesuwa się w górę, a następnie animuje do pierwotnego rozmiaru i lokalizacji. pochodzenie przesuwa się w górę o X i przesuwa się w dół do miejsca, w którym powinno być, zamiast do powiększania widoku.zmiana rozmiaru UIScrollView z blokiem Animacja przesuwa pochodzenie

- (void)keyboardWillShow:(NSNotification *)n 
{ 
    keyboardMove = self.rightScrollView.frame; 
    offsetMove = self.rightScrollView.contentOffset; 

    NSDictionary* userInfo = [n userInfo]; 

    CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    [UIView animateWithDuration:.25 
          delay:0 
         options:(UIViewAnimationOptionAllowUserInteraction) 
        animations:^ 
        { 
         self.rightScrollView.frame = CGRectMake(self.rightScrollView.frame.origin.x, self.rightScrollView.frame.origin.y, self.rightScrollView.frame.size.width, (self.view.frame.size.height - (self.rightScrollView.frame.origin.y + keyboardSize.height))); 
        } 
        completion:nil]; 

    if ((activeTextField.frame.origin.y + activeTextField.frame.size.height) > self.rightScrollView.frame.size.height) 
    {   
     float contentOffsetMove = (self.rightScrollView.contentOffset.y + (activeTextField.frame.origin.y - self.rightScrollView.frame.size.height) + activeTextField.frame.size.height + 10); 

     self.rightScrollView.contentOffset = CGPointMake(self.rightScrollView.contentOffset.x, contentOffsetMove); 
    } 
} 

- (void)keyboardWillHide:(NSNotification *)n 
{ 
    if ((activeTextField.frame.origin.y + activeTextField.frame.size.height) > self.rightScrollView.frame.size.height) 
    { 
     [UIView animateWithDuration:.25 
           delay:0 
          options:(UIViewAnimationOptionAllowUserInteraction) 
         animations:^{ 
          [self.rightScrollView setContentOffset:offsetMove animated:YES]; 

          self.rightScrollView.frame = keyboardMove; 
         } 
         completion:nil]; 

    } 
    else 
    { 
     [UIView animateWithDuration:.25 
           delay:0 
          options:(UIViewAnimationOptionAllowUserInteraction) 
         animations:^{ 
          self.rightScrollView.frame = keyboardMove; 
         } 
         completion:nil]; 
    } 
} 

więc, gdy klawiatura ukrywa, self.rightScrollView.origin porusza się punkty X, a następnie animuje się lokalizacja jest powinno być. potrzebuję, by pochodzenie pozostało na miejscu, a wysokość stała się większa (rośnie w dół).

żadnych pomysłów, dlaczego jej zachowanie jest głupie?

+0

nie uda Ci się rozwiązać ten problem? Mam dokładnie ten sam problem i nie mogę znaleźć dla niego rozwiązania? – pnizzle

Odpowiedz

2

Wierzę, że jest to potencjalnie błąd w UIKit, ale sposobem obejścia tego jest praca z scrollView's contentInset zamiast dopasowywania ramki. Więc:

Zamiast

self.rightScrollView.frame = CGRectMake(self.rightScrollView.frame.origin.x, 
             self.rightScrollView.frame.origin.y, 
             self.rightScrollView.frame.size.width, 
             (self.view.frame.size.height - (self.rightScrollView.frame.origin.y + keyboardSize.height))); 

zrobić

self.rightScrollView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0); 
+0

to przenosi wstawki, ale nie osiąga tego, czego szukam. teraz zmniejszam ramkę, przesuwaj contentOffset w górę, jeśli szerokość pola tekstowego jest większa (tj. jest poniżej ramki), a następnie zawartość widoku przewijania. Twoja sugestia utrzymuje ramkę przewijania tak samo i po prostu przesuwa wstawki, pozostawiając ukryte pola tekstowe za klawiaturą. – Padin215

+0

To problem przewijania, prawda? '- (void) scrollRectToVisible: (CGRect) animowany: (BOOL);' może pomóc. – Joony

0

Próbowałaś literowania animacji dokładnie jak chcesz to się stało? To znaczy. jeśli chcesz zwiększyć wysokość, zrób to. Zamiast

self.rightScrollView.frame = keyboardMove; 

można zrobić

CGRect f = self.rightScrollView.frame; 
f.size.height += keyboardMove.size.height - f.size.height; 
self.rightScrollView.frame = f; 
+1

próbowałem, nadal mam ten sam problem. – Padin215

+0

Myślałem o tym. Oto kolejny pomysł: dzieje się tak tylko z 'UIScrollView', dlaczego nie spróbujesz ustawić właściwości' scrollEnabled' na 'NO' przed animacją? – Mundi

+0

Wciąż mam ten problem osobiście –

3

ja nie wiem, czy nadal jesteś zainteresowany odpowiedzią ponieważ widzę ostatnia aktywność tutaj było rok temu, ale dzisiaj natknąłem dokładnie ten sam problem w iOS 6 i postanowił udostępnić moje rozwiązanie każdemu, kto nadal jest zainteresowany.

Zauważyłem, że przesunięcie, o które przesuwa się UIScrollView, jest o połowę mniejsze niż wysokość klawiatury, ale tylko wtedy, gdy zawartość UIScrollView jest przesunięta. Więc moim obejściem było przeniesienie UIScrollView DOWN z dokładnie taką samą ilością tuż przed animacją, jeśli przesunięcie zawartości UIScrollView jest większe niż 0. Działa to dobrze zarówno na iPhone 4 (ekran 3,5 ") i iPhone 5 (ekran 4") dla teraz, ale nie wiem, co się stanie, jeśli Apple zdecyduje się to naprawić, na wypadek gdyby to był błąd UIKit.

W każdym razie, tu jest mój kod dla jasności:

- (void)keyboardWillHide:(NSNotification *)notification 
{ 
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    if (self.scrollView.contentOffset.y > 0) { 
     CGRect f = CGRectMake(0, keyboardSize.height/2, self.scrollView.frame.size.width, self.scrollView.frame.size.height); 
     self.scrollView.frame = f; 
    } 

    [UIView animateWithDuration:0.25 animations:^{ 
     self.scrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); 
    }]; 
}