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