2016-04-25 4 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, потому что с помощью сочетания клавиш это было бы так, когда вы не хотели бы анимировать экран.

Это, безусловно, лучший метод, который я видел после очистки стека. Если кто-нибудь найдет ошибку в функциональности, сообщите мне, но я уверен, что он позаботится о том, что проблемы с клавиатурой на клавиатуре быстрого доступа отключены. Надеюсь, это поможет всем остальным смутить все это!

Смежные вопросы