为什么UIView的帧在我收到UIKeyboardWillShowNotification后自动更改?

时间:2016-09-02 12:46:45

标签: ios animation keyboard uiviewanimation

我注意到一种令人惊讶的行为:当我在收到UIViewUIKeyboardWillShowNotification后更改UIKeyboardWillHideNotification的框架时,框架的更改为动画 。看起来这个动画使用与键盘相同的持续时间和缓和曲线。在这个项目中,我不使用Autolayout,我通过设置框架以编程方式放置视图。

有人可以向我解释这里发生了什么吗?

代码

UIViewController的viewDidLoad()的有趣部分:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillShow), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillDisappear), name: UIKeyboardWillHideNotification, object: nil)

someView.frame = CGRect(origin: CGPoint(x: 0, y: view.bounds.height - 10), size: CGSize(width: 10, height: 10))
someView.backgroundColor = UIColor.redColor()
view.addSubview(someView)

回调:

func keyboardWillShow(notification: NSNotification) {
    someView.frame.origin = CGPoint(x: 0, y: 0)
}

func keyboardWillDisappear(notification: NSNotification) {
    someView.frame.origin = CGPoint(x: 0, y: view.bounds.size.height - someView.bounds.size.height)    
}

更多细节

  • 回调只被调用一次。
  • 我正在使用标准的UIViewController。
  • 我没有在UIKeyboardDid...通知
  • 的回调中获得动画
  • 我可以通过调用来阻止自动动画 在设置我的UIViews框架之前UIView.commitAnimations(),但是这个 好像很讨厌。
  • 不应该涉及Autolayout,因为我通过设置框架来展示视图

进一步的问题

  • 这是预期的行为吗?
  • 是否记录在某处?
  • 是否有一种很好的方法可以禁用这些动画?
  • 依靠这种行为可以节省吗?
  • 我可以在收到UIKeyboardWill...通知时安全地播放自定义动画吗?

1 个答案:

答案 0 :(得分:1)

答案:

  • 是的,因为这些通知中的代码专门用于为视图设置动画以响应键盘的外观,例如滚动滚动视图或将文本字段移动到正确的位置。
  • 除了可用的键盘通知文档here
  • 之外,我找不到任何其他内容
  • Synchronizing Animations in keyboardWillShow keyboardWillHide -- Hardware Keyboard & Virtual Keyboard Simultaneously - 相关问题
  • 要停用这些动画,请调用didShowdidHide通知,因为它们包含动画提交后要执行的代码。
  • 只要您使用键盘动画效果很好,是的!但这些通知旨在用于处理视图内的键盘动画交互,而不是其他无关的动画。您应该尝试在滚动视图中设置动画视图并在接收键盘通知时相应地滚动它们,以获得更好的体验。

希望我帮助过。