कीबोर्ड की ऊंचाई कैसे प्राप्त करें?


109

अलग-अलग iOS उपकरणों पर एक कीबोर्ड की ऊंचाई अलग-अलग होती है। क्या किसी को पता है कि मैं प्रोग्राम से डिवाइस के कीबोर्ड की ऊंचाई कैसे प्राप्त कर सकता हूं?


1
के संभावित डुप्लिकेट stackoverflow.com/questions/11284321/...
Kendel

जवाबों:


217

स्विफ्ट में:

आप 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 के लिए जाँच। सभी संदर्भों में अभी भी सही नहीं होगा?
एंटोन ट्रोपास्को

5
हां, स्विफ्ट 3 में इसकी गड़बड़ है। हर बार अलग मूल्य देते हुए
महेश अग्रवाल

NotificationCenter.default.addObserver (self, selector: #selector (keyboardWillShow), नाम: .UIKeyboardWillShow, ऑब्जेक्ट: nil) ठीक सिंटैक्स है
shinyuX

क्या होगा यदि आपके पास पहले से ही कीबोर्ड दिखाई देता है, और आप डिवाइस को घुमाते हैं, तो आप नए कीबोर्ड की ऊँचाई को कैसे पाते हैं?
खुरई

1
स्विफ्ट 4 के लिए इसका प्रयोग करें : UIResponder.keyboardWillShowNotificationनाम बिट में
जॉर्ज_ई

63

स्विफ्ट 3.0 और स्विफ्ट 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
यह काम करता है, आप इसे और अधिक स्विफ्ट 3.0 के अनुरूप बनाने के लिए keyboardWillShowपैरामीटर के प्रकार के Notificationहो सकते हैं।
bfich

1
जब हम फ़ंक्शन keyBoardWillShow () कहते हैं, तो वास्तव में हम तर्क के रूप में क्या कहते हैं? मैंने ViewDidLoad में पहली पंक्ति और क्लास में फंक्शन जोड़ा है ... लेकिन मुझे यकीन नहीं है कि इसे कैसे हाहा कहा जाए
VDog

1
@Vog आप इसे कॉल न करें, कीबोर्ड दिखाए जाने पर iOS इसे कॉल करेगा
यिर्मयाह नून

4
अधिसूचना के लिए पंजीकरण करना viewDidLoadएक अच्छा विचार नहीं है: आपने मिलान removeObserverकॉल कहां रखा है ताकि जब यह वीसी अब नहीं दिखाया जा रहा है, तो यह सूचनाएं प्राप्त करना बंद कर देता है? नोटिफिकेशन के लिए रजिस्ट्रेशन viewWillAppearremoveObserverviewWillDisappear
कराना

5
आपको "UIKeyboardFrameBeginUserInfoKey" को "UIKeyboardFrameEndUserInfoKey" में बदलना होगा क्योंकि आपके उदाहरण में आप अक्सर शून्य ऊँचाई प्राप्त कर सकते हैं। विवरण: stackoverflow.com/questions/45689664/…
andreylanadelrey

26

स्विफ्ट 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
इनमें से किसी भी प्रश्न का पहला उत्तर सुरक्षित क्षेत्रों को ध्यान में रखता है। धन्यवाद!
ज़च निकोल

20

अद्यतन स्विफ्ट 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:)) 
}

अद्यतन स्विफ्ट 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 को दो बार कॉल किया जा सकता है और उसे अलग परिणाम मिल सकता है, इस लेख में बताया गया है कि दो बार क्यों बुलाया गया।

स्विफ्ट में 2.2

स्विफ्ट 2.2 चयनकर्ताओं के लिए तार का उपयोग करते हुए चित्रित करता है और इसके बजाय नए सिंटैक्स का परिचय देता है #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
डिनिट में ऑब्जर्वर को हटाने के लिए मत भूलना, उदाहरण के लिए: NSNotificationCenter.defaultCenter ()। removeObserver (स्व)
टैपमनकी

11

यहां छोटा संस्करण:

func keyboardWillShow(notification: NSNotification) {

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

1
सूचना के तहत आप कीबोर्डव्यू के लिए किस तर्क से गुजरते हैं?
VDog

यह बताना मुश्किल है, मैं पोस्टर के कोड ब्लॉक का जवाब दे रहा था ... लेकिन यह इस लाइन के साथ मेल खाता है (let 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) 
      }

}

4

स्विफ्ट 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 द्वारा विधि Xcode 10 में स्विफ्ट 5 के लिए अपडेट की गई

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

}

यह पहली बार एक कार्यक्रम के निष्पादन के दौरान कहा जाता है के बाद अलग ऊंचाइयों देता है।
ब्रैंडन स्टिलिटानो

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

उममीद है कि इससे मदद मिलेगी।
-आप कुंजीपटल होगा अब ऑटो करीब जब पाठ फ़ील्ड के उपयोगकर्ता नल के बाहर और
- यह ऊपर कुंजीपटल करने के लिए सभी को देखने के लिए धक्का होगा जब कुंजीपटल दिखाई देते हैं। -जब
भी जरूरत हो आप बर्खास्तगीबोर्ड () का उपयोग कर सकते हैं


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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.