2009-09-14 10 views
32

Jakiś czas temu, widziałem stałą pewnego rodzaju, która określała szybkość animacji Klawiatury na iPhonie i nie mogę na całe życie zapamiętać, gdzie to widziałem ... żadnego wglądu?Jaka jest domyślna częstotliwość animacji klawiatury telefonu iPhone?

+4

To zawsze 0,3 ! : P –

+8

Styl klawiatury i zachowanie podczas obrotu zostały zmienione między 2.2.1 a 3.0; kto powiedział, że nie zmieni wskaźnika animacji w późniejszych wersjach? – rpetrich

+0

Jeszcze lepszą odpowiedź można znaleźć na stronie http://stackoverflow.com/a/19235995/39946 Zapewnia ona poprawny czas trwania i poprawną krzywą animacji. –

Odpowiedz

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

Jeśli przyszedłeś tutaj, szukając odpowiedzi MonoTouch, nie szukaj dalej niż "e.AnimationDuration". –

+2

Należy zwrócić uwagę, że aby być precyzyjnym, należy również dostosować inne klawisze animacji, takie jak 'UIKeyboardAnimationCurveUserInfoKey'. – Rick

+0

@Dan, jestem użytkownikiem MonoTouch, ale czym jest 'e'? –

2

UIKeyboardAnimationDurationUserInfoKey Klucz dla obiektu NSValue zawierający podwójne oznaczenie czasu trwania animacji w sekundach.

+0

Hej mate, jest kluczem UIKeyboardAnimationDurationUserInfoKey w słowniku informacji użytkownika powiadomienia ???? -thx – ShortCircuit

11

Ponieważ jest to pierwszy google hit, chciałbym podkreślić, że ciężko kodowania 0.3 będzie oznaczać, że widok będzie nieprawidłowo animować gdy użytkownicy międzynarodowych (np japoński) wymiany między różnymi wielkości klawiatur (gdy to działanie powinno być natychmiastowe).

Zawsze używaj wartości parametru UIKeyboardAnimationDurationUserInfoKey w słowniku użytkownika userInfo wartość - zostanie ustawiona na 0, gdy użytkownik przegląda klawisze.

+2

UWAGA: w chwili pisania (iOS 5.1.1) domyślny czas trwania wynosi teraz 0,25 s. Tak więc, jak mówi @greenlight, nigdy nie twórzcie tego - używajcie danych ze słownika userInfo powiadomienia. –

6

Aby dodać trochę więcej do tego, co napisał Shaggy Frog. Pełne wdrożenie byłoby coś jak:

[[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 teraz jest obiektem NSNumber, który sprawia, że ​​kod krótszy.

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

Jedna linijka: 'podwójny czas trwania = [notification.userInfo [UIKeyboardAnimationDurationUserInfoKey] doubleValue];' –

2

w Swift kod będzie wyglądać następująco:

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 - pracował dla mnie:

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

W trybie debugowania mój duration został 3.499999

Powiązane problemy