我有一个视图控制器,它在ViewWillAppear上创建了一个UITextField firstResponder。通常我可以依靠UIKeyboardWillShow通知来检测键盘是否显示,但如果我在键盘显示时进入当前视图控制器,则不会触发。
有人有什么想法吗?
答案 0 :(得分:2)
当您输入textField
时,它将成为第一响应者,然后键盘将显示在您的视图中。您可以在viewWillAppear
方法[textField isFirstResponder]中检查键盘的状态。如果返回YES,表示键盘可见。
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if([textField isFirstResponder]){
//visible keyboard
}
}
<强>被修改强>
如果你想要高度,你可以将键盘高度存储在某个类变量中,当它第一次出现并在viewWillAppear
方法中使用时
@implementation YourClass{
CGFloat keyboardSize;
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if([textField isFirstResponder]){
//user keyboardSize here
}
}
答案 1 :(得分:1)
我在调试视图层次结构时注意到,当键盘出现时,层次结构中有UIRemoteKeyboardWindow
。
首先,我们可以向UIApplication添加扩展,以检查UIRemoteKeyboardWindow
的窗口层次结构:
extension UIApplication {
var isKeyboardPresented: Bool {
if let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow"), self.windows.contains(where: { $0.isKind(of: keyboardWindowClass) }) {
return true
} else {
return false
}
}
}
然后在viewDidLoad
,或在需要的地方,我们可以查看:
if UIApplication.shared.isKeyboardPresented {
print("Keyboard is presented")
}
虽然此方法尚未经过全面测试,但UIRemoteKeyboardWindow
位于私有标头中,因此需要NSClassFromString
进行检查。关注使用它!