2009-09-14 11 views
32

Hace un tiempo recuerdo haber visto una constante de algún tipo que definía la tasa de animación del teclado en el iPhone y no puedo recordar dónde la vi ... ¿alguna idea?¿Cuál es la tasa de animación de teclado predeterminada del iPhone?

+4

Siempre es 0,3 ! : P –

+8

El estilo de teclado y el comportamiento de rotación se cambiaron entre 2.2.1 y 3.0; ¿quién puede decir que no cambiarán la tasa de animación en versiones posteriores? – rpetrich

+0

Se puede encontrar una respuesta aún mejor en http://stackoverflow.com/a/19235995/39946 Proporciona la duración correcta y la curva de animación correcta. –

Respuesta

65
- (NSTimeInterval)keyboardAnimationDurationForNotification:(NSNotification*)notification 
{ 
    NSDictionary* info = [notification userInfo]; 
    NSValue* value = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey]; 
    NSTimeInterval duration = 0; 
    [value getValue:&duration]; 
    return duration; 
} 
+1

Si vino aquí buscando la respuesta de MonoTouch, no busque más, 'e.AnimationDuration'. –

+2

Tenga en cuenta que, para ser precisos, también debe ajustar las otras teclas de animación, como 'UIKeyboardAnimationCurveUserInfoKey'. – Rick

+0

@Dan, soy usuario de MonoTouch, pero ¿qué es 'e'? –

2

UIKeyboardAnimationDurationUserInfoKey La clave para un objeto NSValue que contiene un doble que identifica la duración de la animación en segundos.

+0

Oye compañero, ¿la clave UIKeyboardAnimationDurationUserInfoKey en el diccionario de información de usuario de la notificación ???? -thx – ShortCircuit

11

Dado que este es el primer golpe google, me gustaría señalar que dura codificación de 0,3 significa que la vista se animará de forma incorrecta cuando los usuarios internacionales (por ejemplo japonés) de intercambio entre diferentes tamaños de teclados (cuando esa acción debería ser instantánea).

Utilice siempre el valor UIKeyboardAnimationDurationUserInfoKey del diccionario de usuario de notificación - se establece en 0 cuando el usuario está pasando por los teclados.

+2

NB: en el momento de la escritura (iOS 5.1.1) la duración predeterminada ahora es 0.25s. Así que, como dice @greenlight, nunca codifique esto: use los datos del diccionario userInfo de la notificación. –

6

Para agregar un poco más a lo que Shaggy Frog escribió. La plena aplicación sería algo así como:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardMovement:) 
              name:UIKeyboardWillShowNotification 
              object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardMovement:) 
              name:UIKeyboardWillHideNotification 
              object:nil]; 


-(void)keyboardMovement:(NSNotification *)notification{ 
    if (_numericKeyboardShowing == false){ 
     [UIView animateWithDuration:[self keyboardAnimationDurationForNotification:notification] delay:0 
         options:UIViewAnimationCurveEaseInOut 
        animations:^ { 
         self.bottomContainerView.center = CGPointMake(self.bottomContainerView.center.x, (self.bottomContainerView.center.y - 218)); 
            } 
        completion:NULL]; 

    _numericKeyboardShowing = true; 
    } 
    else{ 
    [UIView animateWithDuration:[self keyboardAnimationDurationForNotification:notification] delay:0 
         options:UIViewAnimationCurveLinear 
        animations:^ { 
         self.bottomContainerView.center = CGPointMake(self.bottomContainerView.center.x, (self.bottomContainerView.center.y + 218)); 
        } 
        completion:NULL]; 

    _numericKeyboardShowing = false; 
} 

- (NSTimeInterval)keyboardAnimationDurationForNotification:(NSNotification *)notification 
{ 
    NSDictionary *info  = [notification userInfo]; 
    NSValue* value   = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey]; 
    NSTimeInterval duration = 0; 
    [value getValue:&duration]; 
    return duration; 
} 
16

UIKeyboardAnimationDurationUserInfoKey ahora es un objeto NSNumber, que hace que el código más corto.

- (void)keyboardWillShowNotification:(NSNotification *)notification 
{ 
    NSDictionary *info = [notification userInfo]; 
    NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey]; 
    double duration = [number doubleValue]; 
} 
+0

One-liner: 'double duration = [notification.userInfo [UIKeyboardAnimationDurationUserInfoKey] doubleValue];' –

2

En Swift su código se verá así:

let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size 

let animationDuration = ((userInfo[UIKeyboardAnimationDurationUserInfoKey]) as! NSNumber).floatValue 
let animationOptions = ((userInfo[UIKeyboardAnimationCurveUserInfoKey]) as! NSNumber).unsignedLongValue 

UIView.animateWithDuration(NSTimeInterval(animationDuration), delay: 0, 
    options: UIViewAnimationOptions(rawValue: animationOptions), 
    animations: {() -> Void in 
       self.view.frame.origin.y += keyboardSize.height 
       }, 
    completion: nil) 
0

Swift 4 - trabajó para mí:

 if let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? Double { 
      UIView.animate(withDuration: duration, animations: { 
       self.view.layoutIfNeeded() 
      }) 
     } 

En el modo de depuración mi duration se 3.499999

Cuestiones relacionadas