วิธีรับความสูงของแป้นพิมพ์?


109

ความสูงของแป้นพิมพ์บนอุปกรณ์ iOS ที่แตกต่างกันนั้นแตกต่างกัน มีใครรู้บ้างว่าฉันจะได้รับความสูงของแป้นพิมพ์ของอุปกรณ์โดยทางโปรแกรม


1
เป็นไปได้ที่จะทำสำเนาstackoverflow.com/questions/11284321/…
Kendel

คำตอบ:


217

ใน Swift:

คุณสามารถรับความสูงของแป้นพิมพ์ได้โดยสมัครรับการUIKeyboardWillShowNotificationแจ้งเตือน (สมมติว่าคุณต้องการทราบความสูงก่อนที่จะแสดง)

สิ่งนี้:

สวิฟต์ 2

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

สวิฟต์ 3

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

สวิฟต์ 4

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

จากนั้นคุณสามารถเข้าถึงความสูงในkeyboardWillShowฟังก์ชั่นดังนี้:

สวิฟต์ 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
}

สวิฟต์ 3

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

สวิฟต์ 4

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

ฉันไม่เข้าใจว่าทำไมผู้ชายที่นี่ถึงคิดว่า-in-g.net/ghawk/blog/2012/09/…ตรวจสอบ isPortrait keyboardRectangle.height จะยังคงถูกต้องในทุกทิศทางหรือไม่?
Anton Tropashko

5
ใช่ใน 3 อย่างรวดเร็วมันยุ่งเหยิง ให้คุณค่าที่แตกต่างกันทุกครั้ง
Mahesh Agrawal

NotificationCenter.default.addObserver (self, selector: #selector (keyboardWillShow), name: .UIKeyboardWillShow, object: nil) เป็นไวยากรณ์ที่ถูกต้อง
shinyuX

จะเกิดอะไรขึ้นถ้าคุณมองเห็นแป้นพิมพ์อยู่แล้วและคุณหมุนอุปกรณ์คุณจะพบความสูงของแป้นพิมพ์ใหม่ได้อย่างไร
Khoury

1
ใช้สิ่งนี้สำหรับSwift 4 : UIResponder.keyboardWillShowNotificationในชื่อบิต
George_E

63

Swift 3.0 และ Swift 4.1

1- ลงทะเบียนการแจ้งเตือนในviewWillAppearวิธีการ:

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

2- วิธีการเรียก:

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

3
วิธีนี้ใช้งานได้คุณยังสามารถกำหนดให้keyboardWillShowพารามิเตอร์เป็นประเภทNotificationเพื่อให้สอดคล้องกับ Swift 3.0 มากขึ้น
bfich

1
เมื่อเราเรียกใช้ฟังก์ชัน keyBoardWillShow () เราจะใส่อะไรเป็นอาร์กิวเมนต์? ฉันได้เพิ่มบรรทัดแรกใน viewDidLoad และฟังก์ชันในคลาส ... แต่ฉันไม่แน่ใจว่าจะเรียกมันว่า
ฮาฮาได้อย่างไร

1
@VDog คุณไม่เรียกมัน iOS จะเรียกมันเมื่อคีย์บอร์ดแสดง
Jeremiah Nunn

4
การลงทะเบียนเพื่อรับการแจ้งเตือนviewDidLoadไม่ใช่ความคิดที่ดี: คุณวางremoveObserverสายที่ตรงกันไว้ที่ไหนเพื่อที่เมื่อ VC นี้ไม่แสดงอีกต่อไประบบจะหยุดรับการแจ้งเตือน จะดีกว่าที่จะลงทะเบียนสำหรับการแจ้งเตือนviewWillAppearแล้วremoveObserverโทรเข้าviewWillDisappear
xaphod

5
คุณต้องเปลี่ยน "UIKeyboardFrameBeginUserInfoKey" เป็น "UIKeyboardFrameEndUserInfoKey" เนื่องจากในตัวอย่างของคุณมักจะมีความสูงเป็นศูนย์ รายละเอียด: stackoverflow.com/questions/45689664/…
andreylanadelrey

27

Swift 4 และข้อ จำกัด

ในการดูตารางของคุณให้เพิ่มข้อ จำกัด ด้านล่างที่สัมพันธ์กับพื้นที่ปลอดภัยด้านล่าง ในกรณีของฉันข้อ จำกัด เรียกว่า 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
คำตอบแรกสำหรับคำถามเหล่านี้ที่คำนึงถึงพื้นที่ปลอดภัย ขอบคุณ!
Zach Nicoll

20

อัปเดต Swift 4.2

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

วิธีการเลือก:

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

ส่วนขยาย:

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

อัปเดต Swift 3.0

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

วิธีการเลือก:

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

ส่วนขยาย:

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

เคล็ดลับ

UIKeyboardDidShowNotification หรือ UIKeyboardWillShowNotification อาจเรียกสองครั้งและได้ผลลัพธ์ที่แตกต่างกันบทความนี้อธิบายว่าเหตุใดจึงเรียกสองครั้ง

ใน Swift 2.2

สวิฟท์ 2.2 deprecates #selectorใช้สตริงสำหรับเตอร์และแทนที่จะแนะนำไวยากรณ์ใหม่:

สิ่งที่ต้องการ:

private func setUpObserver() {

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

วิธีการเลือก:

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

ส่วนขยาย:

    private extension Selector {

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

3
อย่าลืมที่จะเอาผู้สังเกตการณ์ใน deinit เช่น:. NSNotificationCenter.defaultCenter () removeObserver (ตัวเอง)
tapmonkey

11

รุ่นสั้นกว่าที่นี่:

func keyboardWillShow(notification: NSNotification) {

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

1
คุณส่งอาร์กิวเมนต์อะไรสำหรับ keyboardWillShow ภายใต้การแจ้งเตือน?
VDog

ยากที่จะบอกฉันกำลังตอบกลับบล็อกรหัสของโปสเตอร์ ... แต่มันสอดคล้องกับบรรทัดนี้ (ให้ userInfo: NSDictionary = notification.userInfo!)
Alessign

6

สวิฟต์ 4 .

วิธีที่ง่ายที่สุด

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

}

5

สวิฟต์ 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

// ขั้นตอนที่ 1: - ลงทะเบียน 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)
}

// ขั้นตอนที่ 2: - วิธีการเหล่านี้จะถูกเรียกโดยอัตโนมัติเมื่อแป้นพิมพ์ปรากฏขึ้นหรือซ่อน

    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

วิธีการโดย ZAFAR007 อัปเดตสำหรับ Swift 5 ใน 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)
    }

}

สิ่งนี้จะให้ความสูงที่แตกต่างกันหลังจากครั้งแรกที่มีการเรียกใช้ระหว่างการทำงานของโปรแกรม
Brandon Stillitano

0

ฉันต้องทำสิ่งนี้ นี่เป็นความลับเล็กน้อย ไม่แนะนำ
แต่ฉันพบว่าสิ่งนี้มีประโยชน์มาก

ฉันสร้างส่วนขยายและโครงสร้าง

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

การใช้งาน:
รับข้อ จำกัด ด้านล่างส่วนใหญ่

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

เรียกใช้ฟังก์ชันภายในviewDidLoad ()

override func viewDidLoad() {
    super.viewDidLoad()

    hideKeyboardWhenTappedAround()
    listenerKeyboard(bottomConstraint: bottomConstraint)

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

หวังว่าจะช่วยได้
- แป้นพิมพ์ของคุณจะปิดโดยอัตโนมัติเมื่อผู้ใช้แตะนอกฟิลด์ข้อความและ
- มันจะดันมุมมองทั้งหมดไปที่แป้นพิมพ์ด้านบนเมื่อแป้นพิมพ์ปรากฏขึ้น
- คุณยังสามารถใช้deleteKeyboard ()เมื่อคุณต้องการ


0

ฉันใช้รหัสด้านล่าง

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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.