2016-10-04 126 views
0

我想动画(上下)视图控制器中的所有视图时,用户从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() 
     }) 
    } 
} 

enter image description here

回答

1

调用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

+0

@ Connor Neville - 问题是视图立即生成动画,但显然这是一个预期的行为。如果我正确理解这一点'self.view.layoutIfNeeded'直接从viewController更新主视图中的所有视图,但为什么动画应用于所有视图,位置和大小(如果我只指定了动画)其中一个约束?我希望能够动画所有视图,但只能上下调整以适应该约束的值。 –

+1

立即发生动画,因为键盘立即出现,这对我来说听起来很明智,但如果您不想在第一次加载时使用动画,则可以为第一次加载设置某种布尔标志。是的,这是layoutIfNeeded的预期行为,因为一个约束更改可以并且经常会改变整个视图的布局。 – Connor

+0

@ Connor Neville - 现在有道理。还有一个问题:我如何跟踪负载?这可以解决我的问题,因为动画工作正如我预期的第一次加载之后。如果这太复杂了,我会按照答案中的建议,将视图添加到单个视图中。但我很好奇,看看这是如何完成的。谢谢。 –