2012-01-17 10 views
5

estoy en el proceso de desplazar un UIScrollView arriba si el teclado esconderá un UITextField. Reduzco la altura de UIScrollView si se tapa, lo que funciona bien. pero cuando trato de hacer crecer la altura de UIScrollView (de vuelta al tamaño original), todo el UIScrollView sube y luego se anima hasta el tamaño y la ubicación originales. el origen se mueve hacia arriba en una cantidad de X y se mueve hacia abajo a donde debería estar en lugar de hacia la altura de la vista que se expande hacia abajo.redimensionando un UIScrollView con el bloque Animation mueve el origen

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

así, cuando se esconde el teclado, se mueve hacia arriba self.rightScrollView.origin puntos X y luego anima a la ubicación es que debería ser. Necesito el origen para permanecer quieto y la altura se vuelve más (crece hacia abajo).

¿Alguna idea de por qué su comportamiento es ridículo?

+0

has hecho para solucionar este problema? ¿Tengo exactamente el mismo problema y no puedo encontrar una solución para eso? – pnizzle

Respuesta

2

Creo que esto es potencialmente un error en UIKit, pero la forma de solucionar esto es trabajar con contentInset de scrollView en lugar de ajustar el marco. Por lo tanto:

En lugar de

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

hacer

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

esto mueve las inserciones, pero no logra lo que estoy buscando. en este momento, reduzco mi marco, muevo contentOffset hacia arriba si el orígen del cuadro de texto es mayor (es decir, está debajo del marco) y luego el contenido de la vista de desplazamiento. su sugerencia mantiene el marco de scrollview igual y simplemente mueve las inserciones, dejando algunos cuadros de texto ocultos detrás del teclado. – Padin215

+0

Entonces es un problema de desplazamiento, ¿no es así? '- (void) scrollRectToVisible: (CGRect) animado: (BOOL);' podría ayudar. – Joony

0

¿Usted intentó deletreando la animación exactamente cómo desea que suceda? Es decir. si quieres que la altura aumente, hazlo. En lugar de

self.rightScrollView.frame = keyboardMove; 

que podría hacer

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

lo intentó, todavía tiene el mismo problema. – Padin215

+0

He estado pensando en esto. Aquí hay otra idea: esto sucede solo con un 'UIScrollView' ¿por qué no intentas establecer la propiedad' scrollEnabled' en 'NO' antes de la animación? – Mundi

+0

Todavía tengo este problema yo mismo –

3

No sé si todavía estás interesado en la respuesta ya que veo la última actividad aquí fue hace un año, pero hoy me encontré con exactamente el mismo problema en iOS 6 y decidí compartir mi solución con cualquier persona interesada.

Noté que el desplazamiento por el cual UIScrollView se mueve hacia arriba es la mitad del tamaño de la altura del teclado, pero solo si el contenido de UIScrollView está compensado. Así que mi solución fue mover UIScrollView DOWN con la misma cantidad justo antes de la animación, si el offset del contenido de UIScrollView es mayor que 0. Esto funciona bien tanto en iPhone 4 (pantalla de 3.5 ") como en iPhone 5 (pantalla de 4"). ahora, pero no sé qué pasará si Apple decide arreglar esto, en caso de que realmente sea un error de UIKit.

De todos modos, aquí está mi código para mayor claridad:

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