当 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/