为什么我在收到 UIKeyboardWillShowNotification 后更改其框架的 UIView 会自动设置动画?
Why is a UIView whose frame I change after receiving a UIKeyboardWillShowNotification automatically animated?
我注意到一个令人惊讶的行为:当我在收到 UIKeyboardWillShowNotification
或 UIKeyboardWillHideNotification
后更改 UIView
的框架时,框架的更改是 动画。看起来这个动画使用了与键盘相同的持续时间和缓动曲线。在这个项目中,我不使用 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...
通知的回调中获得动画
- 我可以通过调用来阻止自动动画
UIView.commitAnimations()
在设置我的 UIViews Frame 之前,但是这个
看起来很老套。
- 不应涉及自动布局,因为我是通过设置框架来布置视图的
更多问题
- 这是预期的行为吗?
- 它在某处记录了吗?
- 有什么好的方法可以禁用这样的动画吗?
- 靠这个行为省钱吗?
- 我可以在收到
UIKeyboardWill...
通知时安全地播放自定义动画吗?
答案:
- 是的,因为这些通知中的代码专门用于为您的视图设置动画以响应键盘的外观,例如滚动滚动视图或将文本字段移动到正确的位置。
- 除了可用的键盘通知文档,我找不到任何东西here
- Synchronizing Animations in keyboardWillShow keyboardWillHide -- Hardware Keyboard & Virtual Keyboard Simultaneously - 相关问题
- 要禁用这些动画,请调用
didShow
和 didHide
通知,因为它们包含在动画提交后要执行的代码。
- 是的。
- 只要你键盘动画用得好,就可以!但这些通知旨在用于处理视图内的键盘动画交互,而不是其他不相关的动画。您应该将您尝试在滚动视图中设置动画的那些不相关的动画视图,并在收到键盘通知时相应地滚动它,以获得更好的体验。
希望我帮到了你。
我注意到一个令人惊讶的行为:当我在收到 UIKeyboardWillShowNotification
或 UIKeyboardWillHideNotification
后更改 UIView
的框架时,框架的更改是 动画。看起来这个动画使用了与键盘相同的持续时间和缓动曲线。在这个项目中,我不使用 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...
通知的回调中获得动画 - 我可以通过调用来阻止自动动画
UIView.commitAnimations()
在设置我的 UIViews Frame 之前,但是这个 看起来很老套。 - 不应涉及自动布局,因为我是通过设置框架来布置视图的
更多问题
- 这是预期的行为吗?
- 它在某处记录了吗?
- 有什么好的方法可以禁用这样的动画吗?
- 靠这个行为省钱吗?
- 我可以在收到
UIKeyboardWill...
通知时安全地播放自定义动画吗?
答案:
- 是的,因为这些通知中的代码专门用于为您的视图设置动画以响应键盘的外观,例如滚动滚动视图或将文本字段移动到正确的位置。
- 除了可用的键盘通知文档,我找不到任何东西here
- Synchronizing Animations in keyboardWillShow keyboardWillHide -- Hardware Keyboard & Virtual Keyboard Simultaneously - 相关问题
- 要禁用这些动画,请调用
didShow
和didHide
通知,因为它们包含在动画提交后要执行的代码。 - 是的。
- 只要你键盘动画用得好,就可以!但这些通知旨在用于处理视图内的键盘动画交互,而不是其他不相关的动画。您应该将您尝试在滚动视图中设置动画的那些不相关的动画视图,并在收到键盘通知时相应地滚动它,以获得更好的体验。
希望我帮到了你。