2016-10-04 109 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 - 現在有道理。還有一個問題:我如何跟蹤負載?這可以解決我的問題,因爲動畫工作正如我預期的第一次加載之後。如果這太複雜了,我會按照答案中的建議,將視圖添加到單個視圖中。但我很好奇,看看這是如何完成的。謝謝。 –