2016-04-25 59 views
2

給定一個UIViewController,我只想從外部鍵盤接收文本輸入。認爲UIKeyCommand但任何字符(不只是'修改')。iOS支持外部鍵盤不顯示一個

但是,當我嘗試使用UIKeyInput實現時,似乎iOS拼命想要顯示一個鍵盤,如果沒有外部連接。

有什麼辦法可以規避嗎?特別是,如果並且只有在連接了一個選項的情況下,纔有選項可以從鍵盤接收鍵盤輸入?

回答

1

經過一小時擺弄iPad後,終於有了一個很好的解決方案。其他方法很弱或使用第三方軟件。爲什麼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也很重要,因爲使用快捷欄時,您不想爲屏幕設置動畫效果。

這是迄今爲止我在淘洗堆棧溢出後看到的最好的方法。如果任何人發現功能中存在錯誤,請告訴我,但我相信它會照顧到煩人的快捷欄外部鍵盤問題。我希望這可以幫助其他所有人感到困惑!