티스토리 뷰

iOS

iOS ) UIKey

Zedd0202 2020. 5. 16. 20:02
반응형

 

안녕하세요 :) Zedd입니다.

올해 초..!?에..뭐 이제 키보드.....위/아래 방향키를 감지 할 수 있다?라는 트윗을 봤었어요..!

앱을 사용할 때 나오는 키보드 말고, 물리적인 키보드(physical keyboard)의 key 감지요!

아니 근데 제가 이쪽 지식을 아예 몰라서..

원래 뭐 다른 방법으로 됐었는데, 그냥 다른 방법 하나가 새로 나온건지..

아예 안됐는데 이제 된건지....는 확실하게 모르겠네요 ㅎ

근데 아예 안된건 아닌 것 같아요..!

 

아무튼 바로 시작해보겠셈~~

결론부터 말하면

 

UIKey라는 클래스를 사용하면 됩니다. 

정의는 키보드의 key상태에 대한 정보를 제공하는 객체!

UIKey는 사용자가 key를 눌렀다가 놓을 때 키보드의 현재 key 상태에 대한 관련 정보를 제공한다고 합니다. 

developer.apple.com/documentation/uikit/mac_catalyst/handling_key_presses_made_on_a_physical_keyboard?language=objc

 

Handling Key Presses Made on a Physical Keyboard | Apple Developer Documentation

Article Handling Key Presses Made on a Physical Keyboard Detect when the user presses and releases keys on a physical keyboard. OverviewIn iOS apps and Mac apps built with Mac Catalyst, the system reports key presses that a user makes on a physical keyboar

developer.apple.com

이런 아티클도 있네요.

 

자, 그럼 사용자가 물리적keyboard누른거 어떻게 감지하냐!?!?

자 여러분, UIViewController도

UIResponder객체잖아요~

physical keyboard의 key press를 감지하고 싶으면,

UIResponder 객체 안에서 pressesBegan:withEvent: 를 오버라이드하면 됩니다.

UIViewController가 UIResponder객체이니 UIViewController안에서 해주면 될 것 같아요. 

ㅇㅇ

그리고 사용자가 어떤 key를 눌렀는지 확인하려면, 파라미터에 Set<UIPress>이 있죠?

저 set를 돌면서 각 press의 key 프로퍼티를 검사하면 됩니다. 

 

key라는 프로퍼티가 있는거에요!

이 key가 바로 오늘의 주인공..UIKey타입입니다.

응 출력

그러하다...

 

UIKey에는 

4개의 프로퍼티가 있습니다.

하나씩 볼게요!

 

keyCode : key의 HID(Human Interface Device)  usage code..

이 프로퍼티를 사용하면...USB Keyboard의 key를 식별하는 HID usage code를 알수 있다고 합니다............

1. 언어가 개 다양하자나

2. 모든 언어에 대해 정확한 key 매핑을 지정하는 것 불가능;

3. HID usage code가 특정 언어의 key에 특정되지 않은 경우, 키보드 펌웨어는 가장 가까운 동등한 key 위치(position)를 사용하므로, 제조업체는 단순히 다른 keycaps을 인쇄하여 다른 언어의 키보드를 생산 할 수 있음 (쿠ㅠㅜㅠㅜ뭔소리야 ㅠ)

4. 예를 들어주겠음; 북미 키보드의 Y key가 있음. 독일에서 Z key는 일반적으로 Y key 위치를 차지함. 

헐랭 그러네

 Z usage code를 descriptor list의 해당 위치에 배치하기 위해,

키보드 펌웨어를 변경하지 않고, 공급업체는 북미 및 독일어 키보드 모두에서 Y usage code를 사용함.

5. key 매핑이 정확하지 않을 수 있으므로, keyCode대신 charactersIgnoringModifiers를 사용하여 key의 텍스트 값을 결정하렴

 

ㅎ 제가 잘 이해한건지 모르겠네요......제가 keyCode를 쓸 일이 없ㄱ다는건 알겠ㅇ음...

그러니까 제가 이해 한 바로는,,,,보통..우리의 키보드의 Y위치는 T옆이잖아요? 독일처럼 X옆이 아니라??

근데 이런거 하나하나 대응이 불가능하니까..키보드 펌웨어는 그대로 두고,

독일키보드에서 Z를 누르면 Y usage code가 나온다...!

이말 같네요..

 

키보드 펌웨어를 업데이트 하면 독일에는 Y자리에 Y usage code가,

Z에는 Z usage code가 제대로 나올텐데 걍 그걸 안한다는 것 같음.

안한다..기 보다 안할 수도 있으니 = 즉 HID가 정확하지 않을 수 있으니 charactersIgnoringModifiers쓰렴 같음

 

아니면 댓글 달아주세요~

 

modifierFlags : 사용자가 key를 누르는 동안 누르고 있는 modifier keys..

UIKeyModifierFlags.에는 이런것들이 있어요. 보면 바로 이해갈 듯..

ㅇㅇ

만약 제가 그냥 l을 눌렀어요, 그럼 modifierFlags는 걍

이렇게만 나와요. 

 

근데 제가 shift를 누른상태로 l을 눌렀어요

그럼 modifierFlags는 이런식으로 나오게 됩니당~

위에는 그냥 출력해서 그런데 ㅠ

enum이니 

이런식으로 사용하시면 됩니다..!

 

characters와. charactersIgnoringModifiers는 같이볼게요. 

characters - active modifier keys와 결합된 key의 Text값을 나타내는 문자열. 

charactersIgnoringModifiers - modifier keys가 없는 Text값을 나타내는 문자열.

 

바로 위 그림이 아주 좋은 예제군요. 

characters / charactersIgnoringModifiers순 

 

저는 Shift라는 modifier를 누른채로 l을 눌렀어요. 

characters는 "active modifier keys와 결합된 key의 Text값을 나타내는 문자열" 이니까 Shift + l = L 

charactersIgnoringModifiers는 modifier를 무시한거니까 그냥 l이 나온거에요!

이해가시죠!?

 

자, 그럼 애플 예제를 살펴보겠습니당. 

위 코드는 사용자가 왼쪽/오른쪽 화살표키를 누르면 게임 캐릭터가 앞뒤로 실행되는 그런 코드래요~

암튼 이런식으로 사용하면 된다!

주의 하셔야 할 점은 위 코드 처럼 didHandleEvent를 두고, 내가 처리할 것만 처리해야해요.

그 외의 상황에서는 반드시 super를 호출해야합니다.

 

 

우리는 지금 pressesBegan만 봤는데, pressesBegan를 포함하여,

ended(사용자가 key를 놓을 때),

changed,

cancelled도 있습니다!

각 메소드에서 자기가 해주고 싶은걸 정의하면 되겠죠!?

 

진짜 코드 진짜 별거 없는데 그냥 github에 만듬ㅋ

도움이 되었길 바랍니다!

 

+ ) 참고로 modifier같은 경우(shift, command 등등) 에는 character가 ""로 나옵니다!

반응형

'iOS' 카테고리의 다른 글

iOS 13+ ) Restoring Your App’s State  (0) 2020.06.25
iOS ) Share Extension (1)  (4) 2020.06.10
iOS ) PHContentEditingInput  (0) 2020.05.05
iOS ) CIFilter 사용해보기  (1) 2020.05.01
Line graph animation  (1) 2020.04.23