ios 动态获取键盘的边框

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11989306/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 19:44:51  来源:igfitidea点击:

Get the frame of the keyboard dynamically

iphoneioskeyboarduitextview

提问by lu yuan

Is it possible to get the frame, actually its height, of the keyboard dynamically? As I have a UITextViewand I would like to adjust its height according to the keyboard frame height, when the input method of the keyboard is changed. As you know, different input methods may have different keyboard frame height.

是否可以动态获取键盘的框架,实际上是它的高度?因为我有一个UITextView,我想根据键盘框架高度调整它的高度,当键盘的输入法改变时。如您所知,不同的输入法可能会有不同的键盘边框高度。

回答by Hector

try this:

尝试这个:

[[NSNotificationCenter defaultCenter] addObserver:self
                                     selector:@selector(keyboardWasShown:)
                                         name:UIKeyboardDidShowNotification
                                       object:nil];

- (void)keyboardWasShown:(NSNotification *)notification
{

// Get the size of the keyboard.
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

//Given size may not account for screen rotation
int height = MIN(keyboardSize.height,keyboardSize.width);
int width = MAX(keyboardSize.height,keyboardSize.width);

//your other code here..........
}

Tutorial for more information

教程以获取更多信息

回答by TeaCupApp

Just follow this tutorial from Apple and you will get what you want. Apple Documentation. In order to determine the area covered by keyboard please refer to this tutorial.

只需按照 Apple 的本教程进行操作,您就会得到您想要的。苹果文档。为了确定键盘覆盖的区域,请参考本教程

回答by Domenico

For the Swift 3 users, the @Hector code (with some additions) would be:

对于 Swift 3 用户,@Hector 代码(添加一些内容)将是:

In your viewDidLoadadd the observer :

在您viewDidLoad添加观察者:

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidShow(_:)), name: .UIKeyboardDidShow , object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidHide(_:)), name: .UIKeyboardDidHide , object: nil)

Then implement those methods:

然后实现这些方法:

func keyboardDidShow(_ notification: NSNotification) {
     print("Keyboard will show!")
     // print(notification.userInfo)

     let keyboardSize:CGSize = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue.size
     print("Keyboard size: \(keyboardSize)")  

     let height = min(keyboardSize.height, keyboardSize.width)
     let width = max(keyboardSize.height, keyboardSize.width)

}

func keyboardDidHide(_ notification: NSNotification) {
        print("Keyboard will hide!")
}

回答by MendyK

You can add this code to the view which contains the text field in Swift 3. This will make the text field animate up and down with the keyboard.

您可以将此代码添加到包含 Swift 3 中文本字段的视图中。这将使文本字段随着键盘上下移动。

private var keyboardIsVisible = false
private var keyboardHeight: CGFloat = 0.0

// MARK: Notifications

private func registerForKeyboardNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
private func deregisterFromKeyboardNotifications() {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

// MARK: Triggered Functions

@objc private func keyboardWillShow(notification: NSNotification) {
    keyboardIsVisible = true
    guard let userInfo = notification.userInfo else {
        return
    }
    if let keyboardHeight = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.height {
        self.keyboardHeight = keyboardHeight
    }
    if !textField.isHidden {
        if let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber,
            let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber {
            animateHUDWith(duration: duration.doubleValue,
                           curve: UIViewAnimationCurve(rawValue: curve.intValue) ?? UIViewAnimationCurve.easeInOut,
                           toLocation: calculateTextFieldCenter())
        }
    }
}

@objc private func keyboardWillBeHidden(notification: NSNotification) {
    keyboardIsVisible = false
    if !self.isHidden {
        guard let userInfo = notification.userInfo else {
            return
        }
        if let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber,
            let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber {
            animateHUDWith(duration: duration.doubleValue,
                           curve: UIViewAnimationCurve(rawValue: curve.intValue) ?? UIViewAnimationCurve.easeInOut,
                           toLocation: calculateTextFieldCenter())
        }
    }
}

// MARK: - Helpers

private func animateHUDWith(duration: Double, curve: UIViewAnimationCurve, toLocation location: CGPoint) {
    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationDuration(TimeInterval(duration))
    UIView.setAnimationCurve(curve)
    textField.center = location
    UIView.commitAnimations()
}

private func calculateTextFieldCenter() -> CGPoint {
    if !keyboardIsVisible {
        return self.center
    } else {
        let yLocation = (self.view.frame.height - keyboardHeight) / 2
        return CGPoint(x: self.center.x, y: yLocation)
    }
}