gpt4 book ai didi

ios - 在不显示键盘的情况下获取iOS键盘的高度

转载 作者:可可西里 更新时间:2023-11-01 03:28:26 26 4
gpt4 key购买 nike

我正在尝试获取 iOS 键盘的高度。我已经完成并使用了涉及订阅通知的方法,如下所述: https://gist.github.com/philipmcdermott/5183731

- (void)viewDidAppear:(BOOL) animated {
[super viewDidAppear:animated];
// Register notification when the keyboard will be show
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];

// Register notification when the keyboard will be hide
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
CGRect keyboardBounds;

[[notification.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue:&keyboardBounds];

// Do something with keyboard height
}

- (void)keyboardWillHide:(NSNotification *)notification {
CGRect keyboardBounds;

[[notification.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue:&keyboardBounds];

// Do something with keyboard height
}

这在用户实际显示键盘时效果很好。

我的问题:我有另一个 View ,我们称它为 micView,它可能会在键盘出现之前显示。用户可以选择在打字前使用麦克风。我希望 micView 与键盘高度相同,这就是为什么我需要键盘的高度,但在键盘被迫出现之前我需要它。因此,在我需要读取高度值之前,未达到 UIKeyboardWillShowNotification。

我的问题是:如何在不显示键盘的情况下通过通知或其他一些方法获取键盘的高度。

我考虑过明确强制键盘出现在 viewDidLoad 中,这样我就可以将一个实例变量设置为该值,然后隐藏它并摆脱这两种情况的动画。但这真的是唯一的方法吗?

最佳答案

这个 Swift 类提供了一个交 key 解决方案来管理所有必要的通知和初始化,让您只需调用一个类方法并返回键盘大小或高度。

从 Swift 调用:

let keyboardHeight = KeyboardService.keyboardHeight()
let keyboardSize = KeyboardService.keyboardSize()

从 Objective-C 调用:

 CGFloat keyboardHeight = [KeyboardService keyboardHeight];
CGRect keyboardSize = [KeyboardService keyboardSize];

如果想将其用于初始 View 布局,请从类的 viewWillAppear 方法中调用此方法,您希望在键盘出现之前获得键盘高度或大小。不应在 viewDidLoad 中调用它,因为正确的值取决于您的 View 布局。然后,您可以使用从 KeyboardService 返回的值设置自动布局约束常量,或以其他方式使用该值。例如,您可能希望在 prepareForSegue 中获取键盘高度,以帮助设置与通过嵌入转场填充的 containerView 的内容关联的值。

注意安全区域、键盘高度和 iPhone X:
键盘高度的值返回键盘的完整高度,在 iPhone X 上它延伸到屏幕本身的边缘,而不仅仅是插入的安全区域。因此,如果使用返回值设置自动布局约束值,则应将该约束附加到父 View 底部边缘,而不是安全区域。

注意模拟器中的硬件键盘:
连接硬件键盘时,此代码将提供该硬件键盘的屏幕高度,即无高度。当然,确实需要考虑这种状态,因为这模拟了将硬件键盘连接到实际设备时会发生的情况。因此,期望键盘高度的布局需要适本地响应零键盘高度。

KeyboardService 类:
与往常一样,如果从 Objective-C 调用,您只需在 Objective-C 类中导入应用程序的 Swift 桥接头文件 MyApp-Swift.h

import UIKit

class KeyboardService: NSObject {
static var serviceSingleton = KeyboardService()
var measuredSize: CGRect = CGRect.zero

@objc class func keyboardHeight() -> CGFloat {
let keyboardSize = KeyboardService.keyboardSize()
return keyboardSize.size.height
}

@objc class func keyboardSize() -> CGRect {
return serviceSingleton.measuredSize
}

private func observeKeyboardNotifications() {
let center = NotificationCenter.default
center.addObserver(self, selector: #selector(self.keyboardChange), name: .UIKeyboardDidShow, object: nil)
}

private func observeKeyboard() {
let field = UITextField()
UIApplication.shared.windows.first?.addSubview(field)
field.becomeFirstResponder()
field.resignFirstResponder()
field.removeFromSuperview()
}

@objc private func keyboardChange(_ notification: Notification) {
guard measuredSize == CGRect.zero, let info = notification.userInfo,
let value = info[UIKeyboardFrameEndUserInfoKey] as? NSValue
else { return }

measuredSize = value.cgRectValue
}

override init() {
super.init()
observeKeyboardNotifications()
observeKeyboard()
}

deinit {
NotificationCenter.default.removeObserver(self)
}
}

点头:
此处的 observeKeyboard 方法基于 Peres 在对这个问题的 Objective-C 回答中概述的原始方法。

关于ios - 在不显示键盘的情况下获取iOS键盘的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26981261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com