Wie bekomme ich die Höhe der Tastatur?


Antworten:


217

In Swift:

Sie können die Tastaturhöhe ermitteln, indem Sie die UIKeyboardWillShowNotificationBenachrichtigung abonnieren . (Angenommen, Sie möchten wissen, wie hoch die Höhe sein wird, bevor sie angezeigt wird.)

Etwas wie das:

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
)

Dann können Sie in folgenden keyboardWillShowFunktionen auf die Höhe zugreifen :

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
    }
}

Ich verstehe nicht, warum der Typ hier think-in-g.net/ghawk/blog/2012/09/… nach isPortrait sucht. Wird die Tastatur nicht in allen Ausrichtungen korrekt sein?
Anton Tropashko

4
Ja, in Swift 3 ist es durcheinander. jedes Mal einen anderen Wert geben
Mahesh Agrawal

NotificationCenter.default.addObserver (self, Selektor: #selector (keyboardWillShow), Name: .UIKeyboardWillShow, Objekt: nil) ist die richtige Syntax
shinyuX

Was passiert, wenn Sie die Tastatur bereits sichtbar haben und das Gerät drehen? Wie finden Sie die neue Tastaturhöhe?
Khoury

1
Verwenden Sie dies für Swift 4 : UIResponder.keyboardWillShowNotificationim
Namensbit

63

Swift 3.0 und Swift 4.1

1- Registrieren Sie die Benachrichtigung in der viewWillAppearMethode:

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

2- Aufzurufende Methode:

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

3
Dies funktioniert. Sie können auch festlegen, dass der keyboardWillShowParameter vom Typ ist Notification, um Swift 3.0-kompatibler zu machen.
bfich

1
Was genau setzen wir als Argument ein, wenn wir die Funktion keyBoardWillShow () aufrufen? Ich habe die erste Zeile in viewDidLoad und die Funktion in der Klasse hinzugefügt ... aber ich bin nicht sicher, wie ich es nennen soll haha
VDog

1
@VDog Sie nennen es nicht, iOS wird es anrufen, wenn die Tastatur angezeigt wird
Jeremiah Nunn

4
Es viewDidLoadist keine gute Idee, sich für die Benachrichtigung in zu registrieren : Wo platzieren Sie den passenden removeObserverAnruf, damit keine Benachrichtigungen mehr angezeigt werden, wenn diese VC nicht mehr angezeigt wird? Es ist besser, die Registrierung für Benachrichtigungen viewWillAppearremoveObserverviewWillDisappear
einzutragen

5
Sie müssen "UIKeyboardFrameBeginUserInfoKey" in "UIKeyboardFrameEndUserInfoKey" ändern, da Sie in Ihrem Beispiel häufig eine Höhe von Null erhalten können. Die Details: stackoverflow.com/questions/45689664/…
andreylanadelrey

26

Swift 4 und Einschränkungen

Fügen Sie Ihrer Tabellenansicht eine untere Einschränkung in Bezug auf den unteren sicheren Bereich hinzu. In meinem Fall heißt die Einschränkung 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
}

2
Die erste Antwort auf eine dieser Fragen, die sichere Bereiche berücksichtigt. Vielen Dank!
Zach Nicoll

19

Aktualisieren Sie Swift 4.2

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

Auswahlmethode:

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

Erweiterung:

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

Aktualisieren Sie Swift 3.0

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

Auswahlmethode:

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

Erweiterung:

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

Trinkgeld

UIKeyboardDidShowNotification oder UIKeyboardWillShowNotification wurden möglicherweise zweimal aufgerufen und erzielten ein anderes Ergebnis. In diesem Artikel wurde erläutert, warum zweimal aufgerufen wurde.

In Swift 2.2

Swift 2.2 veraltet die Verwendung von Zeichenfolgen für Selektoren und führt stattdessen eine neue Syntax ein : #selector.

Etwas wie:

private func setUpObserver() {

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

Auswahlmethode:

@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
}

Erweiterung:

    private extension Selector {

    static let keyboardWillShow = #selector(YourViewController.keyboardWillShow(_:)) 
}

3
Vergessen Sie nicht, den Beobachter in deinit zu entfernen, zB: NSNotificationCenter.defaultCenter (). RemoveObserver (self)
tapmonkey

11

Kürzere Version hier:

func keyboardWillShow(notification: NSNotification) {

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

1
Welches Argument übergeben Sie für KeyboardWillShow unter Benachrichtigung?
VDog

Schwer zu sagen, ich habe auf den Codeblock des Posters geantwortet ... aber er entspricht dieser Zeile (let userInfo: NSDictionary = notification.userInfo!)
Alessign

6

Swift 4 .

Einfachste Methode

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) 
      }

}

4

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)")
            }
        }
    }

2

// Schritt 1: - NotificationCenter registrieren

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)
}

// Schritt 2: - Diese Methoden werden automatisch aufgerufen, wenn die Tastatur angezeigt oder ausgeblendet wird

    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
    }

1

Die Methode von ZAFAR007 wurde für Swift 5 in Xcode 10 aktualisiert

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)
    }

}

Dies ergibt unterschiedliche Höhen nach dem ersten Aufruf während einer Programmausführung.
Brandon Stillitano

0

Ich musste das machen. Das ist ein bisschen Hackery. nicht vorgeschlagen.
aber ich fand das sehr hilfreich,

ich habe Erweiterung und Struktur gemacht

ViewController-Erweiterung + Struktur

import UIKit
struct viewGlobal{
    static var bottomConstraint : NSLayoutConstraint = NSLayoutConstraint()
}

extension UIViewController{ //keyboardHandler
 func hideKeyboardWhenTappedAround() {
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)
 }
 func listenerKeyboard(bottomConstraint: NSLayoutConstraint) {
    viewGlobal.bottomConstraint = bottomConstraint
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    // Register your Notification, To know When Key Board Hides.
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
 }
 //Dismiss Keyboard
 @objc func dismissKeyboard() {
    view.endEditing(true)
 }
 @objc func keyboardWillShow(notification:NSNotification) {
    let userInfo:NSDictionary = notification.userInfo! as NSDictionary
    let keyboardFrame:NSValue = userInfo.value(forKey: UIResponder.keyboardFrameEndUserInfoKey) as! NSValue
    let keyboardRectangle = keyboardFrame.cgRectValue
    let keyboardHeight = keyboardRectangle.height
    UIView.animate(withDuration: 0.5){
        viewGlobal.bottomConstraint.constant = keyboardHeight
    }
 }

 @objc func keyboardWillHide(notification:NSNotification) {
    UIView.animate(withDuration: 0.5){
        viewGlobal.bottomConstraint.constant = 0
    }
 }
}

Verwendung: Holen Sie
sich die unterste Einschränkung

@IBOutlet weak var bottomConstraint: NSLayoutConstraint! // default 0

Rufen Sie die Funktion in viewDidLoad () auf.

override func viewDidLoad() {
    super.viewDidLoad()

    hideKeyboardWhenTappedAround()
    listenerKeyboard(bottomConstraint: bottomConstraint)

    // Do any additional setup after loading the view.
}

Ich hoffe das hilft.
-Sie Tastatur wird nun automatisch schließen , wenn der Benutzer tippt außerhalb von Textfeld und
- es wird allen Blick auf über Tastatur drücken , wenn Tastatur erscheint. -Du könntest
auch entlassenKeyboard () verwenden, wann immer du es brauchst


0

Ich benutze unten Code,

override func viewDidLoad() {
    super.viewDidLoad()
    self.registerObservers()
}

func registerObservers(){

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)

}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}

@objc func keyboardWillAppear(notification: Notification){
    if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight = keyboardRectangle.height
        self.view.transform = CGAffineTransform(translationX: 0, y: -keyboardHeight)
    }
}

@objc func keyboardWillHide(notification: Notification){
        self.view.transform = .identity
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.