ios - 键盘通知后 UIView 动画不起作用

标签 ios swift animation

当 iOS 设备旋转且键盘弹起时,NotificationCenter 发送 UIKeyboardWillChangeFrame 通知。那时我正在尝试启动自定义动画。它不起作用。

我正在尝试启动布局约束动画,但我无法使用任何自定义动画持续时间,因为它以某种方式被系统覆盖了。我将始终获得与键盘向上/向下移动动画相匹配的恒定持续时间。在这种情况下如何使用我自己的动画持续时间。

下面是我想要的行为的代码示例:

@objc func keyboardWillChange(_ notification: NSNotification) {

    let keyboardFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue


        self.textFieldBottomContstrain.constant = -keyboardFrame.height

        UIView.animate(withDuration: myOwnDuration) {
            self.view.layoutIfNeeded()
        }
}

更新

经过一些测试后,我找到了一个非常简单的解决方案,尽管我觉得它有点老套。

但无论如何在 UIView.animate-block 之前添加两行代码似乎重置了自动动画参数并且我自己的参数再次起作用。这是我的工作补充:

UIView.setAnimationsEnabled(false)
UIView.setAnimationsEnabled(true)

更新 2

matt 提供的最佳解决方案。有一种正确的方法可以覆盖运行时设置的原始动画持续时间:https://developer.apple.com/documentation/uikit/uiviewanimationoptions/1622434-overrideinheritedduration

最佳答案

这里的问题是,当 keyboardWillChange 被调用时,您已经在一个您看不到的动画 block 中,该动画 block 由运行时提供以动画化键盘的移动.因此:

  • 不需要UIView.animate,因为您在这里所做的任何可动画化的操作都已经被动画化了。

  • 如果你UIView.animate,你的 duration 将被忽略,因为它是从周围的隐式动画 block 继承的— 除非您添加 选项 以关闭该继承:https://developer.apple.com/documentation/uikit/uiviewanimationoptions/1622434-overrideinheritedduration

  • 你不应该触摸self.view的位置;这不是你的观点。如果您需要在键盘出现时滑动界面,请给 self.view 一个完整的 subview 并滑动它。

关于ios - 键盘通知后 UIView 动画不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49856545/

相关文章:

ios - 在 UITableView 内以编程方式将 UIView 添加到 UIStackView

ios - 覆盖 UIViewController 的 View 属性

ios - 将 Swift 添加到项目中会显着增加大小。如何以及何时可以避免

swift - 不同的部分标题取决于 Collection View 中的部分

javascript - 关闭模态时的 CSS 动画

ios - 如何设置 iOS Telegram 源代码

ios - 更改 NSAttributedString 的字体大小和字体颜色

ios - 在 ViewController 之间传递数据

Android 是否可以使用并发插值器?

xcode - 如何根据另一个 View 为 View 设置动画