动画视图约束而不动画其他视图

时间:2016-10-04 13:46:14

标签: ios swift animation autolayout uikit

当用户从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()
      })
    }
}

enter image description here

1 个答案:

答案 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调用。