2017-01-24 69 views
-1

我正在努力在iOS顯示/隱藏鍵盤時移動我的視圖。 (對不起,不知道如何格式化代碼高亮)Swift 3 move當顯示鍵盤時顯示 - 錯誤KeyboardSize

我實現了下列觀察員:

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 

而這些功能:

func keyboardWillHide(notification: NSNotification) { 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
     if self.view.frame.origin.y != 0 { 
     self.view.frame.origin.y += keyboardSize.height/2 
     } 
    } 
    } 

func keyboardWillShow(notification: NSNotification) { 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
     if self.view.frame.origin.y == 0 { 
     self.view.frame.origin.y -= keyboardSize.height/2 
     } 
    } 
} 

我增加了一個擴展:

extension UIViewController { 
    func hideKeyboardWhenTappedAround() { 
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard)) 
    tap.cancelsTouchesInView = false 
    view.addGestureRecognizer(tap) 
    } 

    func dismissKeyboard() { 
    view.endEditing(true) 
    } 
} 

所以所有這一切工作得很好。 但是,一旦鍵盤認爲顯示單詞建議是個好主意,我就會遇到問題。鍵盤變得越來越高,視圖變得太過分了。 這主要發生在用戶從僅限數字的鍵盤切換到另一個正常鍵盤的文本字段(有時帶有建議)。 那麼,有沒有辦法知道鍵盤當前是否顯示了單詞建議(或任何其他'正常'高度差異)? 我想過使用全局變量的鍵盤高度的keyboardWillShow函數,但這將無法正常工作,因爲我要麼移動到遠或更少,當他們在不同的鍵盤高度(參見數字鍵盤)的文本字段之間切換。 任何幫助,高度讚賞!提前致謝!編輯: 啊!我認爲將willShowKeyboard -height存儲在全局變量中,並將其與willHideKeyboard進行比較 - 高度可能有效。儘管如此,我仍然開放更順暢的解決方案!

+0

我爲什麼要低調投票?我遇到了問題,自己找到了解決方法。有時候我沒有得到SO用戶。 – Akaino

回答

0

關鍵UIKeyboardFrame 開始 UserInfoKey不會爲您提供最終大小 - 因爲名稱提示「開始」。

請嘗試使用它的姐妹UIKeyboardFrame End UserInfoKey - 它會在結束動畫後爲您提供鍵盤最終大小。

注意它沒有考慮旋轉考慮https://developer.apple.com/reference/uikit/uikeyboardframeenduserinfokey

+0

這不會使差異不幸。當我從普通文本字段(帶有單詞建議)切換到數字輸入時,它仍然是不同的鍵盤大小。所以,我需要一種方法來獲得鍵盤大小,而不需要單詞建議部分。 – Akaino

-1

我結束存儲keyboardHeight從keboardWillShow成全局變量,並採取該變量將其移回在keboardWillHide。我正在檢查最後一個keyboardHeight是否等於當前需要移動我的視圖。 不太漂亮。但是,嘿,它的作品!

// keyboardHeight is a global var. 

func keyboardWillShow(notification: NSNotification) { 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
    if self.view.frame.origin.y == 0 || 
     (keyboardHeight != keyboardSize.height/2) 
    { 
     self.view.frame.origin.y = 0 
     self.view.frame.origin.y -= keyboardSize.height/2 
     keyboardHeight = keyboardSize.height/2 
    } 
    } 
} 

func keyboardWillHide(notification: NSNotification) { 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
    _ = keyboardSize.height/2 // to surpress warnings... 
    if self.view.frame.origin.y != 0 { 
     self.view.frame.origin.y += keyboardHeight //keyboardSize.height/2 
    } 
    } 
} 

我不知道這self.view.frame.origin.y = 0keyboardWillShow。我想我會考慮只把它的差異,而不是每次設置爲0。但目前,每個想法都應該如此。

+0

這個解決方案有什麼問題? – Akaino