Il y a quelque temps, je me souviens d'avoir vu une constante quelconque qui définissait le taux d'animation du clavier sur l'iPhone et je ne me souviens plus de l'endroit où je l'ai vue… avez-vous un aperçu?
- (NSTimeInterval)keyboardAnimationDurationForNotification:(NSNotification*)notification
{
NSDictionary* info = [notification userInfo];
NSValue* value = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
NSTimeInterval duration = 0;
[value getValue:&duration];
return duration;
}
UIKeyboardAnimationDurationUserInfoKey est maintenant un objet NSNumber, ce qui raccourcit le code.
- (void)keyboardWillShowNotification:(NSNotification *)notification
{
NSDictionary *info = [notification userInfo];
NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
double duration = [number doubleValue];
}
Comme il s’agit du premier hit de Google, je voudrais souligner que la codification en dur 0.3 signifie que votre vue s’animera de manière incorrecte lorsque des utilisateurs internationaux (par exemple en japonais) basculeront entre des claviers de tailles différentes (lorsque cette action doit être instantanée). .
Toujours utiliser la valeur UIKeyboardAnimationDurationUserInfoKey du dictionnaire userInfo de la notification - elle est définie sur 0 lorsque l'utilisateur fait défiler les claviers.
Pour ajouter un peu plus à ce que Shaggy Frog a écrit. La mise en œuvre complète serait quelque chose comme:
[[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;
}
Dans Swift, votre code ressemblera à ceci:
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)
UIKeyboardAnimationDurationUserInfoKey Clé d'un objet NSValue contenant un double qui identifie la durée de l'animation en secondes.
Swift 4 - a travaillé pour moi:
if let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? Double {
UIView.animate(withDuration: duration, animations: {
self.view.layoutIfNeeded()
})
}
En mode débogage ma duration
était 3.499999