我想动画(上下)视图控制器中的所有视图时,用户从textField移动到textField其中每个textField具有不同高度的键盘,我是使用自动布局来定位所有视图。动画视图约束没有动画其他视图
我使用的是四个UITextFields
和三个UIButtons
使用自动布局,并根据不同的键盘高度上下移动,我的问题是,由于某种原因,所有的视图动画,只要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()
})
}
}
@ Connor Neville - 问题是视图立即生成动画,但显然这是一个预期的行为。如果我正确理解这一点'self.view.layoutIfNeeded'直接从viewController更新主视图中的所有视图,但为什么动画应用于所有视图,位置和大小(如果我只指定了动画)其中一个约束?我希望能够动画所有视图,但只能上下调整以适应该约束的值。 –
立即发生动画,因为键盘立即出现,这对我来说听起来很明智,但如果您不想在第一次加载时使用动画,则可以为第一次加载设置某种布尔标志。是的,这是layoutIfNeeded的预期行为,因为一个约束更改可以并且经常会改变整个视图的布局。 – Connor
@ Connor Neville - 现在有道理。还有一个问题:我如何跟踪负载?这可以解决我的问题,因为动画工作正如我预期的第一次加载之后。如果这太复杂了,我会按照答案中的建议,将视图添加到单个视图中。但我很好奇,看看这是如何完成的。谢谢。 –