2012-01-17 9 views
5

sto facendo scorrere un UIScrollView su se la tastiera nasconderà un UITextField. Riduco l'altezza di UIScrollView se verrà coperto e funziona correttamente. ma quando provo a far crescere l'altezza di UIScrollView (di nuovo alla dimensione originale), l'intero UIScrollView si sposta verso l'alto e quindi si anima fino alla dimensione e alla posizione originale. l'origine si sposta di X e si sposta verso il basso dove dovrebbe essere invece dell'altezza della vista che si espande verso il basso.ridimensionamento di un UIScrollView con il blocco di animazioni si sposta origine

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

così, quando la tastiera nasconde, self.rightScrollView.origin sposta i punti X e poi alla anima la posizione è dovrebbe essere. ho bisogno che l'origine rimanga e l'altezza diventi di più (cresce verso il basso).

qualche idea sul perché si comporta in modo stupido?

+0

siete riusciti a risolvere questo problema? Ho esattamente lo stesso problema e non riesco a trovare una soluzione per questo? – pnizzle

risposta

2

Credo che questo sia potenzialmente un bug in UIKit ma il modo per aggirare questo è quello di lavorare con lo scrollView contentInset invece di regolare il frame. Quindi:

Invece di

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))); 

fare

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

questo sposta gli inserti, ma non raggiunge quello che sto cercando. in questo momento, rimpicciolisco la mia cornice, sposto il contenutoOffset se l'origine della casella di testo è maggiore (cioè è al di sotto della cornice), quindi il contenuto della vista di scorrimento. il tuo suggerimento mantiene lo stesso frame della scrollview e sposta semplicemente gli inserti, lasciando alcuni textbox nascosti dietro la tastiera. – Padin215

+0

Quindi si tratta di un problema di scorrimento, non è così? '- (void) scrollRectToVisible: (CGRect) animato: (BOOL);' potrebbe aiutare. – Joony

0

Avete provato che illustra l'animazione esattamente come si desidera che accada? Cioè se vuoi che l'altezza aumenti, fai proprio questo. Invece di

self.rightScrollView.frame = keyboardMove; 

si potrebbe fare

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

provato, hanno ancora lo stesso problema. – Padin215

+0

Ho pensato a questo. Ecco un'altra idea: ciò accade solo con un 'UIScrollView' perché non provi ad impostare la proprietà' scrollEnabled' su 'NO' prima dell'animazione? – Mundi

+0

Ho ancora questo problema da solo –

3

Non so se siete ancora interessati alla risposta da quando ho visto l'ultima attività qui è stato un anno fa, ma oggi mi sono imbattuto lo stesso identico problema in iOS 6 e ho deciso di condividere la mia soluzione con chiunque fosse ancora interessato.

Ho notato che l'offset con cui si sposta UIScrollView è metà della dimensione dell'altezza della tastiera, ma solo se il contenuto di UIScrollView è sfalsato. Quindi la mia soluzione era spostare l'UIScrollView DOWN con lo stesso importo appena prima dell'animazione, se l'offset del contenuto di UIScrollView è maggiore di 0. Funziona bene sia per iPhone 4 (display da 3,5 ") che per iPhone 5 (display da 4") per ora, ma non so cosa succederà se Apple deciderà di risolvere il problema, nel caso in cui sia davvero un bug UIKit.

Comunque, ecco il mio codice per amor di chiarezza:

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