Bagaimana cara mendapatkan ketinggian Keyboard?

Jawaban:

217

Di Swift:

Anda bisa mengetahui tinggi keyboard dengan berlangganan UIKeyboardWillShowNotificationnotifikasi. (Dengan asumsi Anda ingin tahu berapa tingginya sebelum ditampilkan).

Sesuatu seperti ini:

Cepat 2

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

Cepat 3

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

Cepat 4

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

Kemudian Anda dapat mengakses fungsi ketinggian keyboardWillShowseperti ini:

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

Cepat 3

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

Cepat 4

@objc func keyboardWillShow(_ notification: Notification) {
    if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight = keyboardRectangle.height
    }
}
roc
sumber
Saya tidak mengerti mengapa orang di sini berpikir-in-g.net/ghawk/blog/2012/09/… memeriksa isPortrait. Bukankah keyboardRectangle.height akan tetap benar di semua orientasi?
Anton Tropashko
5
ya, di swift 3 nya kacau. memberikan nilai yang berbeda setiap waktu
Mahesh Agrawal
NotificationCenter.default.addObserver (self, selector: #selector (keyboardWillShow), name: .UIKeyboardWillShow, object: nil) adalah sintaks yang benar
shinyuX
Bagaimana jika Anda sudah memiliki keyboard yang terlihat, dan Anda memutar perangkat, bagaimana Anda menemukan ketinggian keyboard yang baru?
Khoury
1
Gunakan ini untuk Swift 4 : UIResponder.keyboardWillShowNotificationdi bit nama
George_E
63

Swift 3.0 dan Swift 4.1

1- Daftarkan notifikasi dengan viewWillAppearmetode:

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

2- Metode dipanggil:

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardHeight = keyboardSize.height
        print(keyboardHeight)
    }
}
fs_tigre
sumber
3
Ini berfungsi, Anda juga dapat memiliki keyboardWillShowparameter menjadi tipe Notificationuntuk membuatnya lebih sesuai dengan Swift 3.0.
mulai
1
ketika kita memanggil function keyBoardWillShow (), apa sebenarnya yang kita tempatkan sebagai argumen? Saya telah menambahkan baris pertama di viewDidLoad, dan fungsi di kelas ... tapi saya tidak yakin bagaimana menyebutnya haha
VDog
1
@VDog Anda tidak menyebutnya, iOS akan menyebutnya ketika keyboard ditampilkan
Jeremiah Nunn
4
Mendaftar untuk pemberitahuan di viewDidLoadbukanlah ide yang baik: di mana Anda meletakkan removeObserverpanggilan yang cocok sehingga ketika VC ini tidak lagi ditampilkan, ia berhenti menerima pemberitahuan? Lebih baik memasukkan pendaftaran untuk pemberitahuan viewWillAppear, dan kemudian removeObservermeneleponviewWillDisappear
xaphod
5
Anda perlu mengubah "UIKeyboardFrameBeginUserInfoKey" menjadi "UIKeyboardFrameEndUserInfoKey" karena dalam contoh Anda, Anda sering kali mendapatkan ketinggian nol.
Detailnya
26

Swift 4 dan Batasan

Untuk tampilan tabel Anda, tambahkan batasan bawah yang terkait dengan area aman bawah. Dalam kasus saya, kendala disebut 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
}
Eduardo Irias
sumber
2
Jawaban pertama untuk semua pertanyaan ini yang memperhitungkan area aman. Terima kasih!
Zach Nicoll
20

Perbarui Swift 4.2

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

metode pemilih:

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

perpanjangan:

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

Perbarui Swift 3.0

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

metode pemilih:

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

perpanjangan:

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

Tip

UIKeyboardDidShowNotification atau UIKeyboardWillShowNotification mungkin dipanggil dua kali dan mendapat hasil yang berbeda, artikel ini menjelaskan mengapa dipanggil dua kali.

Di Swift 2.2

Swift 2.2 deprecates menggunakan string untuk penyeleksi dan bukannya memperkenalkan sintaks baru: #selector.

Sesuatu seperti:

private func setUpObserver() {

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

metode pemilih:

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

perpanjangan:

    private extension Selector {

    static let keyboardWillShow = #selector(YourViewController.keyboardWillShow(_:)) 
}
Jesse
sumber
3
Jangan lupa untuk menghapus pengamat di deinit, misalnya: NSNotificationCenter.defaultCenter (). RemoveObserver (self)
tapmonkey
11

Versi yang lebih pendek di sini:

func keyboardWillShow(notification: NSNotification) {

        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            let keyboardHeight = keyboardSize.height
        }
}
Sejajarkan
sumber
1
argumen apa yang Anda berikan untuk keyboardWillShow di bawah notifikasi?
VDog
Sulit untuk mengatakan, saya membalas blok kode poster ... tetapi sesuai dengan baris ini (biarkan userInfo: NSDictionary = notification.userInfo!)
Alessign
6

Cepat 4 .

Metode Paling Sederhana

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

}
ZAFAR007
sumber
4

Cepat 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)")
            }
        }
    }
Vivek
sumber
2

// Langkah 1: - Daftarkan 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)
}

// Langkah 2: - Metode ini akan dipanggil Secara Otomatis saat Keyboard muncul atau Tersembunyi

    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
    }
Nrv
sumber
1

Metode oleh ZAFAR007 diperbarui untuk Swift 5 di 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)
    }

}
PTDog94
sumber
Ini memberikan ketinggian yang berbeda setelah pertama kali dipanggil selama eksekusi program.
Brandon Stillitano
0

Saya harus melakukan ini. ini sedikit peretasan. tidak disarankan.
tetapi saya menemukan ini sangat membantu

saya membuat ekstensi dan struct

Ekstensi + Struktur ViewController

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

Penggunaan:
dapatkan batasan paling bawah

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

panggil fungsi di dalam viewDidLoad ()

override func viewDidLoad() {
    super.viewDidLoad()

    hideKeyboardWhenTappedAround()
    listenerKeyboard(bottomConstraint: bottomConstraint)

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

Semoga bantuan ini.
-Anda keyboard sekarang akan otomatis menutup saat pengguna mengetuk di luar bidang teks dan
- itu akan mendorong semua tampilan ke keyboard di atas saat keyboard muncul.
-Anda juga bisa menggunakan rejectKeyboard () kapan pun Anda membutuhkannya

Muhammad Asyraf
sumber
0

Saya menggunakan kode di bawah ini,

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
}
Sazzad Hissain Khan
sumber