当用户从textField移动到textField时,我试图为viewController中的所有视图设置动画(向上和向下),其中每个textField都有一个不同高度的键盘,并且我使用autolayout来定位所有观点。
我所拥有的是四个UITextFields
和三个UIButtons
使用autolayout并根据不同的键盘高度上下移动,我的问题是由于某种原因,所有视图都会尽快生成动画由于viewController加载的不是我想要的,我只希望它们在键盘的高度不同时进行动画处理。一旦加载了viewController,动画看起来就像动画了所有视图的大小和位置一样。
为了驱动动画,我有一个主约束(constraintKeyboardHeight
),其中附加了所有视图以确定它们的垂直位置(见下图)。
仅供参考 - 请注意我在viewDidLoad
方法中自动聚焦其中一个textField。我不确定这是否与它有关。
有什么想法吗?在为具有约束的视图设置动画时,这是正常的行为吗?
override func viewDidLoad() {
super.viewDidLoad()
oneTextField.becomeFirstResponder()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UserInputViewController.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil)
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
keyboardHeight = keyboardSize.height + 10
UIView.animateWithDuration(3.0, animations: {
self.constraintKeyboardHeight.constant = keyboardHeight
self.view.layoutIfNeeded()
})
}
}
答案 0 :(得分:3)
调用self.view.layoutIfNeeded
将触发视图中包含的所有内容的布局更新。如果这包含您不想制作动画的子视图,则应将您做想要动画的所有视图添加到容器子视图中。基于键盘约束容器子视图,并仅在此子视图上调用layoutIfNeeded
。
我有点困惑
我的问题是,由于某种原因,一旦viewController加载了所有视图都会动画,这不是我想要的,我只希望它们在键盘的高度不同时动画
我将这个问题解释为"所有的观点都是动画的"你只想要其中一些。如果问题更多的是关于立即动画的视图,那当然会发生,因为你在视图加载时正确设置了第一个响应者。
编辑:如果您不想在第一次加载时设置动画,则可以向控制器添加属性var firstLoad = true
,然后修改键盘将显示如下功能:
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo [UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
keyboardHeight = keyboardSize.height + 10
self.constraintKeyboardHeight.constant = keyboardHeight
if firstLoad {
view.layoutIfNeeded()
firstLoad = false
} else {
UIView.animateWithDuration(3.0, animations: {
self.view.layoutIfNeeded()
})
}
}
}
您会注意到我已将约束常量线移出动画块。您实际上不需要动画块中的这一行,只需要layoutIfNeeded
调用。