How to reliably detect if an external keyboard is connected on iOS 9?

前端 未结 9 707
隐瞒了意图╮
隐瞒了意图╮ 2020-12-02 13:05

Previous to iOS 9, the most reliable method of determining whether an external keyboard is connected was to listen for UIKeyboardWillShowNotification and make a

9条回答
  •  离开以前
    2020-12-02 14:11

    After going back to the original question, I've found a solution that works.

    It seems that when the regular virtual keyboard is displayed the keyboard frame is within the dimensions of the screen. However when a physical keyboard is connected and the keyboard toolbar is displayed, the keyboard frame is located offscreen. We can check if the keyboard frame is offscreen to determine if the keyboard toolbar is showing.

    Objective-C

    - (void) keyboardWillShow:(NSNotification *)notification {
        NSDictionary* userInfo = [notification userInfo];
        CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
        CGRect keyboard = [self.view convertRect:keyboardFrame fromView:self.view.window];
        CGFloat height = self.view.frame.size.height;
    
        if ((keyboard.origin.y + keyboard.size.height) > height) {
            self.hasKeyboard = YES;
        }
    }
    

    Swift

    @objc func keyboardWillShow(_ notification: NSNotification) {
        guard let userInfo = notification.userInfo else {return}
        let keyboardScreenEndFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        let keyboard = self.view.convert(keyboardScreenEndFrame, from: self.view.window)
        let height = self.view.frame.size.height
        if (keyboard.origin.y + keyboard.size.height) > height {
            self.hasKeyboard = true
        }
    }
    

提交回复
热议问题