Handling Key Presses Made on a Physical Keyboard

Panther·2021년 7월 29일
0

https://developer.apple.com/documentation/uikit/mac_catalyst/handling_key_presses_made_on_a_physical_keyboard

"Detect when the user presses and releases keys on a physical keyboard."

사용자가 물리적 키보드에 키를 누르거나 떼는 것을 감지합니다.

Overview

맥 Catalyst로 빌드된 iOS 앱과 맥 앱에서 시스템은 활성화된 앱의 리스폰더 체인에 있는 리스폰더 객체에게 키보드 누름 이벤트를 보내서 사용자가 물리적 키보드를 누른 것을 알려줍니다.

리스폰더 체인은 앱에서 이벤트를 처리하거나 다른 리스폰더에게 이벤트를 처리하도록 전송할 책임을 갖는 UIResponder 객체의 연결된 연쇄입니다. UIViewController, UIApplication이 대표적인 UIResponder 객체입니다. 리스폰더와 리스폰더 체인에 대한 더 많은 정보는 Using Responders and the Responder Chain to Handle Events를 살펴보시기 바랍니다.

https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/using_responders_and_the_responder_chain_to_handle_events
https://velog.io/@panther222128/Responder-Chain

Detect a Key Press

사용자가 물리적 키보드를 사용해 키를 누른 것을 감지하려면, 앱 딜리게이트 혹은 메인 뷰 컨트롤러와 같은 앱의 리스폰더 객체에서 pressesBega(_:with:)를 오버라이드해야 합니다.

사용자가 어떤 키를 눌렀는지 확인하려면, 누름의 집합을 반복하면서 각각의 누른 것에 대한 키 속성을 검사합니다. 키의 텍스트 값을 확인하려고 하거나 리스폰더가 키 누름을 처리해야 하는지 아닌지를 결정하려면 charactersIgnoringModifiers를 사용해야 합니다. 만약 리스폰더가 키 누름을 처리하지 않는다면, 활성화된 리스폰더 체인 속에서 다음 리스폰더에게 누름 이벤트를 전동하기 위해 pressesBegan(_:with:)를 슈퍼클래스에 오버라이드해야 합니다.

예를 들어 아래 코드 예시는 사용자가 키보드의 왼쪽 오른쪽 방향키를 누를 때 캐릭터가 앞뒤로 뛰는 것을 나타내는 코드입니다.

override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
    // Run backward or forward when the user presses a left or right arrow key.
    
    var didHandleEvent = false
    for press in presses {
        guard let key = press.key else { continue }
        if key.charactersIgnoringModifiers == UIKeyCommand.inputLeftArrow {
            runBackward()
            didHandleEvent = true
        }
        if key.charactersIgnoringModifiers == UIKeyCommand.inputRightArrow {
            runForward()
            didHandleEvent = true
        }
    }
    
    if didHandleEvent == false {
        // Didn't handle this key press, so pass the event to the next responder.
        super.pressesBegan(presses, with: event)
    }
}

Detect a Key Release

사용자가 키보드 키에서 떼는 것을 감지하려면 리스폰더의 pressesEnded(_:with:) 메소드를 오버라이드해야 합니다. 키에 대한 정보를 가져오려면 키를 눌렀을 때와 동일한 작업을 하면 됩니다. 각 누름의 키 속성을 검사하는 것입니다. 예를 들어 아래 나와있는 코드 예시는 사용자가 왼쪽 혹은 오른쪽 방향키를 뗄 때 게임 캐릭터가 특정 방향으로 뛰는 것을 멈추도록 하는 코드를 담고 있습니다.

override func pressesEnded(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
    // Stop running when the user releases the left or right arrow key.

    var didHandleEvent = false
    for press in presses {
        guard let key = press.key else { continue }
        if key.charactersIgnoringModifiers == UIKeyCommand.inputLeftArrow {
            stopRunningBackward()
            didHandleEvent = true
        }
        if key.charactersIgnoringModifiers == UIKeyCommand.inputRightArrow {
            stopRunningForward()
            didHandleEvent = true
        }
    }
    
    if didHandleEvent == false {
        // Didn't handle this key press, so pass the event to the next responder.
        super.pressesBegan(presses, with: event)
    }
}

0개의 댓글