###### tags: `iOS` # 鍵盤 ## 鍵盤監聽、升降 註冊廣播 ```objectivec= override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShowReciver), name: UIWindow.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHideReciver), name: UIWindow.keyboardWillHideNotification, object: nil) } ``` 監聽並開放接口 ```objectivec= @objc fileprivate func keyboardWillShowReciver(notification: NSNotification) { let userInfo = notification.userInfo let keyboardFrame = userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue guard let size = keyboardFrame?.cgRectValue else { return } guard let duration = userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double else { return } keyboardWillShow(duration: duration, height: size.height) } @objc fileprivate func keyboardWillHideReciver(notification: NSNotification){ let userInfo = notification.userInfo guard let duration = userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double else { return } keyboardWillHide(duration: duration) } func keyboardWillShow(duration: Double,height :CGFloat) { } func keyboardWillHide(duration: Double) { } ``` 接口使用 (鍵盤出現時,修改 scroll view 高度,消失時改回去) ```objectivec= override func keyboardWillShow(duration: Double, height: CGFloat) { scrollViewBottom.constant = -(height) } override func keyboardWillHide(duration: Double) { scrollViewBottom.constant = 0 } ``` ## 讓鍵盤消失 點擊鍵盤以外的地方,使鍵盤消失 ### UIViewController ```objectivec= extension UIViewController{ //點鍵盤外 會隱藏鍵盤 open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { //點擊時關閉編輯狀態,即可關閉鍵盤 view.endEditing(true) print("UIViewController touchesBegan") } } ``` ### UIScrollView UIScrollView 需要取得最上層的 UIViewController,所以先寫個擴展 ```objectivec= extension UIApplication { class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { if let nav = base as? UINavigationController { return getTopViewController(base: nav.visibleViewController) } else if let tab = base as? UITabBarController, let selected = tab.selectedViewController { return getTopViewController(base: selected) } else if let presented = base?.presentedViewController { return getTopViewController(base: presented) } return base } } ``` ```objectivec= extension UIScrollView { //點鍵盤外 會隱藏鍵盤 open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { //點擊時關閉編輯狀態,即可關閉鍵盤 UIApplication.getTopViewController()?.view.endEditing(true) print("UIScrollView touchesBegan") } } ```