出现键盘时移动垂直居中的内容

Moving Vertically Centered Content when Keyboard appears

我有一个垂直居中的注册表单。

我想在键盘出现时制作它向上移动的动画。

然而我的实现:

1- 删除 Align center Y to: Superview

2- 挂入键盘框架

3-安装基于键盘框架的约束

制作非常静态的位移,没有动画。

@IBOutlet weak var centerVertically: NSLayoutConstraint!
@IBOutlet weak var bottomDistance: NSLayoutConstraint!

(...)

func keyboardWillShow(notification: NSNotification) {
    var info = notification.userInfo!
    let keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
    bottomDistance.constant = keyboardFrame.size.height + 20

    UIView.animateWithDuration(2.0) { () -> Void in
        self.view.removeConstraint(self.centerVertically)
        self.view.addConstraint(self.bottomDistance)
    }
}

func keyboardWillHide(notification: NSNotification) {
    UIView.animateWithDuration(2.0) { () -> Void in
        self.view.removeConstraint(self.bottomDistance)
        self.view.addConstraint(self.centerVertically)
    }
}

如何正确设置过渡动画?

一些事情,首先你可以挂钩到键盘移动的动画循环中,这样你的动画就会以相同的方式动画 time/duration。

其次,不是添加和删除约束(这将导致您的视图在没有动画的情况下捕捉到位),而是更新动画块内约束的常量值。这是我在 Objective-C 中使用的片段,swift 版本应该是微不足道的。

[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
        UIViewAnimationCurve curve = [[note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
        double duration = [[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
        [UIView animateWithDuration:duration
                              delay:0
                         options:UIViewAnimationOptionBeginFromCurrentState
                         animations:^{
                             [UIView setAnimationCurve:curve];
                             this.verticalConstraint.constant = 100.0f;
                             [this.view layoutIfNeeded];
                         }
                         completion:nil];
        [UIView commitAnimations];

    }];