2009-09-14 9 views
32

Un po 'di tempo fa ricordo di aver visto una costante di qualche tipo che definiva il ritmo di animazione della tastiera sull'iPhone e non posso per la vita di me ricordare dove l'ho visto ... qualche intuizione?Qual è la frequenza di animazione della tastiera predefinita di iPhone?

+4

E 'sempre 0.3 ! : P –

+8

Lo stile della tastiera e il comportamento di rotazione sono stati modificati tra 2.2.1 e 3.0; chi dice che non cambieranno il ritmo di animazione nelle versioni successive? – rpetrich

+0

Una risposta ancora migliore a questo può essere trovata su http://stackoverflow.com/a/19235995/39946 Fornisce la durata corretta e la corretta curva di animazione. –

risposta

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

Se siete venuti qui cercando la risposta di MonoTouch, non cercate oltre "e.AnimationDuration". –

+2

Nota che per essere precisi, dovresti anche regolare gli altri tasti di animazione, come "UIKeyboardAnimationCurveUserInfoKey". – Rick

+0

@Dan, sono un utente di MonoTouch, ma cos'è "e"? –

2

UIKeyboardAnimationDurationUserInfoKey La chiave per un oggetto NSValue che contiene un doppio che identifica la durata dell'animazione in secondi.

+0

Ehi amico, è la chiave UIKeyboardAnimationDurationUserInfoKey nel dizionario delle informazioni utente della notifica ???? -thx – ShortCircuit

11

Dal momento che questo è il primo colpo di Google, vorrei far notare che hard-codifica 0.3 vorrà dire che la visuale si erroneamente animare quando gli utenti internazionali (ad esempio giapponese) di swap tra le tastiere di dimensioni diverse (quando quell'azione dovrebbe essere immediata).

Usare sempre UIKeyboardAnimationDurationUserInfoKey valore del dizionario userInfo della notifica - si ottiene impostato a 0 quando l'utente sta sfogliando tastiere.

+2

NB: al momento della scrittura (iOS 5.1.1) la durata predefinita è ora di 0.25 s. Quindi, come dice @greenlight, non scrivere mai questo codice in modo permanente - usa i dati dal dizionario userinfo della notifica. –

6

Per aggiungere un po 'di più a quello che ha scritto Shaggy Frog. L'implementazione completa sarebbe qualcosa di simile:

[[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 ora è un oggetto NSNumber, che rende il codice più 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

In Swift il codice sarà simile a questa:

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 - ha lavorato per me:

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

In modalità di debug mia duration stato 3.499999

Problemi correlati