Некоторое время назад я помню, что видел какую-то константу, которая определяла скорость анимации клавиатуры на iPhone, и я не могу на всю жизнь помнить, где я ее видел... любое понимание?
Какова стандартная скорость анимации клавиатуры iPhone?
Ответ 1
- (NSTimeInterval)keyboardAnimationDurationForNotification:(NSNotification*)notification
{
NSDictionary* info = [notification userInfo];
NSValue* value = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
NSTimeInterval duration = 0;
[value getValue:&duration];
return duration;
}
Ответ 2
UIKeyboardAnimationDurationUserInfoKey теперь является объектом NSNumber, что делает код короче.
- (void)keyboardWillShowNotification:(NSNotification *)notification
{
NSDictionary *info = [notification userInfo];
NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
double duration = [number doubleValue];
}
Ответ 3
Поскольку это первый хит Google, я хотел бы указать, что жесткое кодирование 0,3 будет означать, что ваше представление будет неправильно отображаться, когда международные пользователи (например, японцы) меняются между клавиатурами различного размера (когда это действие должно быть мгновенным).
Всегда использовать словарь пользовательской информации уведомления UIKeyboardAnimationDurationUserInfoKey value - он получает значение 0, когда пользователь щелкает по клавиатуре.
Ответ 4
Чтобы добавить немного больше того, что написал Shaggy Frog. Полная реализация будет примерно такой:
[[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;
}
Ответ 5
UIKeyboardAnimationDurationUserInfoKey Ключ для объекта NSValue, содержащий двойной, который идентифицирует продолжительность анимации в секундах.
Ответ 6
В Swift ваш код будет выглядеть так:
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)
Ответ 7
Swift 4 - работал у меня:
if let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? Double {
UIView.animate(withDuration: duration, animations: {
self.view.layoutIfNeeded()
})
}
В режиме отладки мой duration
был 3.499999