ios swift uikeyboard

ios - ¿Cómo obtener la altura del teclado?



swift uikeyboard (9)

La altura de un teclado en diferentes dispositivos iOS es diferente. ¿Alguien sabe cómo puedo obtener la altura del teclado de un dispositivo mediante programación?


Swift 5

override func viewDidLoad() { // Registering for keyboard notification. NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil) } /* UIKeyboardWillShowNotification. */ @objc internal func keyboardWillShow(_ notification : Notification?) -> Void { var _kbSize:CGSize! if let info = notification?.userInfo { let frameEndUserInfoKey = UIResponder.keyboardFrameEndUserInfoKey // Getting UIKeyboardSize. if let kbFrame = info[frameEndUserInfoKey] as? CGRect { let screenSize = UIScreen.main.bounds //Calculating actual keyboard displayed size, keyboard frame may be different when hardware keyboard is attached (Bug ID: #469) (Bug ID: #381) let intersectRect = kbFrame.intersection(screenSize) if intersectRect.isNull { _kbSize = CGSize(width: screenSize.size.width, height: 0) } else { _kbSize = intersectRect.size } print("Your Keyboard Size /(_kbSize)") } } }


Swift 3.0 y Swift 4.1

1- Registre la notificación en el método viewWillAppear :

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

2- Método a llamar:

@objc func keyboardWillShow(notification: NSNotification) { if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { let keyboardHeight = keyboardSize.height print(keyboardHeight) } }


// Paso 1: - Registrar NotificationCenter

ViewDidLoad() { self.yourtextfield.becomefirstresponder() // Register your Notification, To know When Key Board Appears. NotificationCenter.default.addObserver(self, selector: #selector(SelectVendorViewController.keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) // Register your Notification, To know When Key Board Hides. NotificationCenter.default.addObserver(self, selector: #selector(SelectVendorViewController.keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil) }

// Paso 2: - Estos métodos se llamarán automáticamente cuando aparezca el teclado o se oculte

func keyboardWillShow(notification:NSNotification) { let userInfo:NSDictionary = notification.userInfo! as NSDictionary let keyboardFrame:NSValue = userInfo.value(forKey: UIKeyboardFrameEndUserInfoKey) as! NSValue let keyboardRectangle = keyboardFrame.cgRectValue let keyboardHeight = keyboardRectangle.height tblViewListData.frame.size.height = fltTblHeight-keyboardHeight } func keyboardWillHide(notification:NSNotification) { tblViewListData.frame.size.height = fltTblHeight }


El método de ZAFAR007 actualizado para Swift 5 en Xcode 10

override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil) } @objc func keyboardWillShow(notification: NSNotification) { if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { let keyboardHeight : Int = Int(keyboardSize.height) print("keyboardHeight",keyboardHeight) } }


Versión más corta aquí:

func keyboardWillShow(notification: NSNotification) { if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { let keyboardHeight = keyboardSize.height } }


Actualizar Swift 4.2

private func setUpObserver() { NotificationCenter.default.addObserver(self, selector: .keyboardWillShow, name: UIResponder.keyboardWillShowNotification, object: nil) }

método selector:

@objc fileprivate func keyboardWillShow(notification:NSNotification) { if let keyboardRectValue = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { let keyboardHeight = keyboardRectValue.height } }

extensión:

private extension Selector { static let keyboardWillShow = #selector(YourViewController.keyboardWillShow(notification:)) }

Actualizar Swift 3.0

private func setUpObserver() { NotificationCenter.default.addObserver(self, selector: .keyboardWillShow, name: .UIKeyboardWillShow, object: nil) }

método selector:

@objc fileprivate func keyboardWillShow(notification:NSNotification) { if let keyboardRectValue = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { let keyboardHeight = keyboardRectValue.height } }

extensión:

private extension Selector { static let keyboardWillShow = #selector(YourViewController.keyboardWillShow(notification:)) }

Propina

UIKeyboardDidShowNotification o UIKeyboardWillShowNotification pueden llamar dos veces y obtener un resultado diferente, este article explica por qué se llama dos veces.

En Swift 2.2

Swift 2.2 deja de utilizar cadenas para selectores y en su lugar introduce una nueva sintaxis: #selector .

Algo como:

private func setUpObserver() { NSNotificationCenter.defaultCenter().addObserver(self, selector: .keyboardWillShow, name: UIKeyboardWillShowNotification, object: nil) }

método selector:

@objc private func keyboardWillShow(notification:NSNotification) { let userInfo:NSDictionary = notification.userInfo! let keyboardFrame:NSValue = userInfo.valueForKey(UIKeyboardFrameEndUserInfoKey) as! NSValue let keyboardRectangle = keyboardFrame.CGRectValue() let keyboardHeight = keyboardRectangle.height editorBottomCT.constant = keyboardHeight }

extensión:

private extension Selector { static let keyboardWillShow = #selector(YourViewController.keyboardWillShow(_:)) }


En Swift:

Puede obtener la altura del teclado suscribiéndose a la notificación UIKeyboardWillShowNotification . (Suponiendo que desea saber cuál será la altura antes de que se muestre).

Algo como esto:

Swift 2

NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)

Swift 3

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

Swift 4

NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil )

Luego puede acceder a la altura en la función keyboardWillShow siguiente manera:

Swift 2

func keyboardWillShow(notification: NSNotification) { let userInfo: NSDictionary = notification.userInfo! let keyboardFrame: NSValue = userInfo.valueForKey(UIKeyboardFrameEndUserInfoKey) as! NSValue let keyboardRectangle = keyboardFrame.CGRectValue() let keyboardHeight = keyboardRectangle.height }

Swift 3

@objc func keyboardWillShow(_ notification: Notification) { if let keyboardFrame: NSValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue { let keyboardRectangle = keyboardFrame.cgRectValue let keyboardHeight = keyboardRectangle.height } }

Swift 4

@objc func keyboardWillShow(_ notification: Notification) { if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue { let keyboardRectangle = keyboardFrame.cgRectValue let keyboardHeight = keyboardRectangle.height } }


Rápido 4 .

Método más simple

override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil) } func keyboardWillShow(notification: NSNotification) { if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { let keyboardHeight : Int = Int(keyboardSize.height) print("keyboardHeight",keyboardHeight) } }


Swift 4 y restricciones

A su vista de tabla agregue una restricción inferior en relación con el área segura inferior. En mi caso, la restricción se llama tableViewBottomLayoutConstraint.

@IBOutlet weak var tableViewBottomLayoutConstraint: NSLayoutConstraint! override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(notification:)), name: .UIKeyboardWillShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear(notification:)), name: .UIKeyboardWillHide, object: nil) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillShow , object: nil) NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillHide , object: nil) } @objc func keyboardWillAppear(notification: NSNotification?) { guard let keyboardFrame = notification?.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return } let keyboardHeight: CGFloat if #available(iOS 11.0, *) { keyboardHeight = keyboardFrame.cgRectValue.height - self.view.safeAreaInsets.bottom } else { keyboardHeight = keyboardFrame.cgRectValue.height } tableViewBottomLayoutConstraint.constant = keyboardHeight } @objc func keyboardWillDisappear(notification: NSNotification?) { tableViewBottomLayoutConstraint.constant = 0.0 }