it-swarm.com.de

iOS 7 - Tastaturanimation

Ich versuche, die neue Tastaturanimation in iOS 7.0 auf dem iPhone 5 Simulator zu verstehen. Ich möchte meine UITableView ändern, wenn die Tastatur angezeigt wird, aber ich kann nicht die richtigen Animationsdetails erhalten.
Ich verwende die Informationen aus dem Objekt NSNotification, wenn die Tastatur angezeigt oder ausgeblendet wird.

Hier ist mein Protokoll:

Move keyboard from {{0, 920}, {320, 216}} to {{0, 352}, {320, 216}}
 with duration: 0.400000
 and animation curve: 7

UIViewAnimationCurveEaseInOut = 0
UIViewAnimationCurveEaseIn = 1
UIViewAnimationCurveEaseOut = 2
UIViewAnimationCurveLinear = 3

Die Animationskurve ist ein unbekannter Wert. Was soll ich tun?

46
Paul Warkentin

Nun habe ich die Lösung gefunden. Die Animation beginnt am Punkt {0, 920} bis {0, 352}. Das Problem war, dass das UITableView-Objekt mit einer Größe von {160, 568} begann. Daher änderte ich die Größe der UITableView in {160, 920}, bevor die Animation gestartet wurde.

In Bezug auf die unbekannte Animationskurve habe ich den Parameter auf animationCurve << 16 gesetzt, um ihn von einer Animationskurve in eine Animationsoption für die Ansicht zu konvertieren.
Der Wert ist nicht gleich der linearen, ein-, aus und ausgehenden Animationskurve.

Hier ist mein Code:

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

und:

- (void)keyboardWillShow:(NSNotification *)aNotification {
    NSDictionary *userInfo = aNotification.userInfo;

    //
    // Get keyboard size.

    NSValue *beginFrameValue = userInfo[UIKeyboardFrameBeginUserInfoKey];
    CGRect keyboardBeginFrame = [self.view convertRect:beginFrameValue.CGRectValue fromView:nil];

    NSValue *endFrameValue = userInfo[UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardEndFrame = [self.view convertRect:endFrameValue.CGRectValue fromView:nil];

    //
    // Get keyboard animation.

    NSNumber *durationValue = userInfo[UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval animationDuration = durationValue.doubleValue;

    NSNumber *curveValue = userInfo[UIKeyboardAnimationCurveUserInfoKey];
    UIViewAnimationCurve animationCurve = curveValue.intValue;

    //
    // Create animation.

    CGRect tableViewFrame = self.tableView.frame;
    bTableViewFrame.size.height = (keyboardBeginFrame.Origin.y - tableViewFrame.Origin.y);
    self.tableView.frame = tableViewFrame;

    void (^animations)() = ^() {
        CGRect tableViewFrame = self.tableView.frame;
        tableViewFrame.size.height = (keyboardEndFrame.Origin.y - tableViewFrame.Origin.y);
        self.tableView.frame = tableViewFrame;
    };

    //
    // Begin animation.

    [UIView animateWithDuration:animationDuration
                          delay:0.0
                        options:(animationCurve << 16)
                     animations:animations
                     completion:nil];
}
47
Paul Warkentin

In iOS 7 verwendet die Tastatur eine neue, undokumentierte Animationskurve. Einige haben zwar festgestellt, dass bei der Animationsoption ein nicht dokumentierter Wert verwendet wird, ich bevorzuge jedoch Folgendes:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
[UIView setAnimationCurve:[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]];
[UIView setAnimationBeginsFromCurrentState:YES];

// work

[UIView commitAnimations];

Während blockbasierte Animationen die Empfehlung sind, ist die von der Tastaturbenachrichtigung zurückgegebene Animationskurve eine UIViewAnimationCurve, während die Option, die Sie an blockbasierte Animationen übergeben müssen, eine UIViewAnimationOptions ist. Wenn Sie die traditionellen UIView-Animationsmethoden verwenden, können Sie den Wert direkt in ein Pipe übergeben. Am wichtigsten ist, dass die neue undokumentierte Animationskurve (ganzzahliger Wert von 7) verwendet wird und die Animation mit der Tastatur übereinstimmt. Und es funktioniert genauso gut auf iOS 6 und 7.

72
David Beck

Sie können einen animateWithDuration-Block verwenden und die Kurve darin einstellen. Es ist sauber und funktioniert gut. 

UIViewAnimationCurve curve = [[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
double duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

[UIView animateWithDuration:duration
                    delay:0
                  options:UIViewAnimationOptionBeginFromCurrentState 
               animations:^{
                 [UIView setAnimationCurve:curve];
                 /* ANIMATION HERE */
                 // don't forget layoutIfNeeded if you use autolayout
               }
               completion:nil];

Viel Spaß beim Codieren!

UPDATE

Sie können eine einfache UIViewController-Kategorie verwenden, die von mir geschrieben wurde. Https://github.com/Just-/UIViewController-KeyboardAnimation

12
Anton Gaenko

Verwenden Sie stattdessen UIKeyboardWillChangeFrameNotification, da einige internationale Tastaturen, wie die chinesische Tastatur, während des Betriebs die Höhe ändern. Dieser Code gibt Ihnen auch im Querformat die richtigen Höhen für die Tastatur an. (Hinweis: Der folgende Code gilt für Autolayout )

//set your observer, in a method like viewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

- (void)keyboardWillChange:(NSNotification *)notification {
    CGRect initialRect = [notification.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    CGFloat initialHeight = self.view.frame.size.height - [self.view convertRect:initialRect fromView:nil].Origin.y;
    CGRect keyboardRect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGFloat newHeight = self.view.frame.size.height - [self.view convertRect:keyboardRect fromView:nil].Origin.y;
    //set your constraints here, based on initialHeight and newHeight, which are the heights of the keyboard before & after animation.
    [self.contentView setNeedsUpdateConstraints];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [self.contentView layoutIfNeeded];
    [UIView commitAnimations];
}
5
Jeffrey Sun

Um dieselbe Animation wie auf der Tastatur zu verwenden, müssen Sie die undokumentierte Option "Kurve" verwenden.

- (void)keyboardWillHide:(NSNotification *)notification {
    NSDictionary *userInfo = [notification userInfo];

    CGRect rect = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    NSTimeInterval animationDuration = [[userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    NSInteger curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue] << 16;

    [UIView animateWithDuration:animationDuration delay:0.0 options:curve animations:^{

    } completion:nil];
}

Ich fand heraus, dass die Methode animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion: die neue Methode ist, mit der alle Animationen jetzt in iOS7 und iOS8 ausgeführt werden. Sie machen nur die richtige Dauer, Dämpfung und Geschwindigkeit, und Sie erhalten den gleichen Effekt, aber auch Sie können Geschwindigkeit/Zeit ändern.

4
invoodoo

In Swift 4

Beobachter für Tastaturbenachrichtigungen hinzufügen:

  • UIKeyboardDidShowNotification
  • UIKeyboardDidHideNotification

via

NSNotificationCenter.defaultCenter().addObserver(_ observer: Any, 
        selector aSelector: Selector, 
        name aName: NSNotification.Name?, 
        object anObject: Any?)

Und implementieren Sie Selector, um die Benutzeroberfläche mit Tastaturanimation zu animieren. Um einen gültigen Kurvenwert zu erstellen, müssen Sie UIResponder.keyboardAnimationCurveUserInfoKey um << 16 verschieben

func keyboardWillShow(_ notification: Notification!) {
    if let info = notification.userInfo {
        let keyboardSize = info[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect
        let duration = info[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double 
        let curveVal = (info[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber)?.intValue ?? 7 // default value for keyboard animation
        let options = UIView.AnimationOptions(rawValue: UInt(curveVal << 16))
        UIView.animate(withDuration: duration, delay: 0, options: options, animations: {
        // any operation to be performed
    }, completion: nil)
    }
}
2
Anu Mittal

Registrieren Sie sich für die Benachrichtigung:

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

Reagiere, indem du eine Änderung am Frame.Origin.y der Ansicht animierst.

- (void)keyboardWillShow:(NSNotification *)aNotification {

    NSDictionary *userInfo = aNotification.userInfo;
    NSValue *endFrameValue = userInfo[UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardEndFrame = [self.view convertRect:endFrameValue.CGRectValue fromView:nil];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[aNotification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[aNotification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]];
    [UIView setAnimationBeginsFromCurrentState:YES];

    CGRect searchButtonFrame = self.searchButton.frame;
    searchButtonFrame.Origin.y = (keyboardEndFrame.Origin.y - searchButtonFrame.size.height);
    self.searchButton.frame = searchButtonFrame;

    [UIView commitAnimations];
}
0