iOS支持外接键盘不显示
iOS Support External Keyboard Without Displaying One
给定一个 UIViewController
,我只想接收来自外部键盘的文本输入。想想 UIKeyCommand
但对于任何字符(不仅仅是 'modified' 个字符)。
但是,当我尝试使用 UIKeyInput
实现它时,似乎 iOS 在没有连接外部键盘的情况下迫切希望显示键盘。
有什么办法可以避免吗?具体来说,如果且仅当一个已连接时,才能选择从键盘接收击键?
摆弄一个iPad一个小时后,我终于在swift中找到了一个很好的解决方案。其他方法较弱或使用 3rd 方软件。 UIKeyboardWillShowNotification
即使在 iPad 使用外部键盘时也会被触发的原因是存在快捷方式栏。要禁用快捷栏,请执行以下操作:
let item : UITextInputAssistantItem = textField.inputAssistantItem
item.leadingBarButtonGroups = []
item.trailingBarButtonGroups = []
这涵盖了您需要的大多数情况,但是如果有人在某些使用点插入键盘,UIKeyboardWillShowNotification
仍然可以触发。如果你有屏幕调整,你不能让用户体验到这种情况。另外,您可能出于某种原因需要快捷方式栏。无论您想要什么,这涵盖了所有使用外接键盘的情况:
添加到viewDidAppear
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(LoginViewController.keyboardWillShow), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(LoginViewController.keyboardWillHide), name: UIKeyboardWillHideNotification, object: nil)
每当您离开视图时,将此添加到让您离开的任何内容中
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
也将其添加到deinit{}
方法中。
现在使用这些功能:
func keyboardWillShow(notification: NSNotification) {
// This code is an alternate way of checking for keyboard
var userInfo: [NSObject: AnyObject] = notification.userInfo!
let firstFrame = userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue
let secondFrame = userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue
let firstRect = firstFrame.CGRectValue()
let secondRect = secondFrame.CGRectValue()
let diff = abs(firstRect.origin.y - secondRect.origin.y)
let isFirstBigger = firstRect.origin.y > secondRect.origin.y
if firstRect != secondRect && diff != 55 {
if !isFirstBigger {
//animateViewToDefaultPosition()
} else {
//animateViewToPositionWhenKeyboardActive()
}
}
}
func keyboardWillHide() {
//animateViewToDefaultPosition()
}
55是快捷栏的高度。如果你没有,你可以删除它的功能。 !isFirstBigger
用于检查他们在编辑文本字段时何时松开键盘并将其重新挂上。在检查期间 diff != 55
也很重要,因为使用快捷栏时,如果您不想为屏幕设置动画,就会出现这种情况。
这是迄今为止我在搜索 Stack Overflow 后看到的最好的方法。如果有人发现功能中的错误,请告诉我,但我相信它会解决讨厌的快捷栏外部键盘问题。我希望这能帮助其他对这一切感到困惑的人!
给定一个 UIViewController
,我只想接收来自外部键盘的文本输入。想想 UIKeyCommand
但对于任何字符(不仅仅是 'modified' 个字符)。
但是,当我尝试使用 UIKeyInput
实现它时,似乎 iOS 在没有连接外部键盘的情况下迫切希望显示键盘。
有什么办法可以避免吗?具体来说,如果且仅当一个已连接时,才能选择从键盘接收击键?
摆弄一个iPad一个小时后,我终于在swift中找到了一个很好的解决方案。其他方法较弱或使用 3rd 方软件。 UIKeyboardWillShowNotification
即使在 iPad 使用外部键盘时也会被触发的原因是存在快捷方式栏。要禁用快捷栏,请执行以下操作:
let item : UITextInputAssistantItem = textField.inputAssistantItem
item.leadingBarButtonGroups = []
item.trailingBarButtonGroups = []
这涵盖了您需要的大多数情况,但是如果有人在某些使用点插入键盘,UIKeyboardWillShowNotification
仍然可以触发。如果你有屏幕调整,你不能让用户体验到这种情况。另外,您可能出于某种原因需要快捷方式栏。无论您想要什么,这涵盖了所有使用外接键盘的情况:
添加到viewDidAppear
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(LoginViewController.keyboardWillShow), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(LoginViewController.keyboardWillHide), name: UIKeyboardWillHideNotification, object: nil)
每当您离开视图时,将此添加到让您离开的任何内容中
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
也将其添加到deinit{}
方法中。
现在使用这些功能:
func keyboardWillShow(notification: NSNotification) {
// This code is an alternate way of checking for keyboard
var userInfo: [NSObject: AnyObject] = notification.userInfo!
let firstFrame = userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue
let secondFrame = userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue
let firstRect = firstFrame.CGRectValue()
let secondRect = secondFrame.CGRectValue()
let diff = abs(firstRect.origin.y - secondRect.origin.y)
let isFirstBigger = firstRect.origin.y > secondRect.origin.y
if firstRect != secondRect && diff != 55 {
if !isFirstBigger {
//animateViewToDefaultPosition()
} else {
//animateViewToPositionWhenKeyboardActive()
}
}
}
func keyboardWillHide() {
//animateViewToDefaultPosition()
}
55是快捷栏的高度。如果你没有,你可以删除它的功能。 !isFirstBigger
用于检查他们在编辑文本字段时何时松开键盘并将其重新挂上。在检查期间 diff != 55
也很重要,因为使用快捷栏时,如果您不想为屏幕设置动画,就会出现这种情况。
这是迄今为止我在搜索 Stack Overflow 后看到的最好的方法。如果有人发现功能中的错误,请告诉我,但我相信它会解决讨厌的快捷栏外部键盘问题。我希望这能帮助其他对这一切感到困惑的人!