【问题标题】:iOS Support External Keyboard Without Displaying OneiOS 支持外接键盘不显示
【发布时间】:2016-08-19 05:05:59
【问题描述】:

给定UIViewController,我想只接收来自外部键盘的文本输入。想想UIKeyCommand,但对于任何角色(不仅仅是“修改”的角色)。

但是,当我尝试使用UIKeyInput 来实现它时,如果没有连接外部键盘,iOS 似乎迫切希望显示一个键盘。

有什么办法可以避免吗?具体来说,当且仅当连接键盘时,是否可以选择从键盘接收击键?

【问题讨论】:

    标签: ios swift keyboard external


    【解决方案1】:

    在 iPad 上摆弄了一个小时后,我终于在 swift 中找到了一个很好的解决方案。其他方法较弱或使用第 3 方软件。即使在 iPad 上使用外部键盘时,UIKeyboardWillShowNotification 也会被触发的原因是存在快捷栏。要禁用快捷栏,请执行以下操作:

        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 后看到的最好的方法。如果有人在功能中发现错误,请告诉我,但我相信它会解决讨厌的快捷栏外部键盘问题。我希望这可以帮助所有被这一切困惑的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-12
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 2017-07-09
      相关资源
      最近更新 更多