티스토리 뷰
안녕하세요 :) Zedd입니다.
올해 초..!?에..뭐 이제 키보드.....위/아래 방향키를 감지 할 수 있다?라는 트윗을 봤었어요..!
앱을 사용할 때 나오는 키보드 말고, 물리적인 키보드(physical keyboard)의 key 감지요!
아니 근데 제가 이쪽 지식을 아예 몰라서..
원래 뭐 다른 방법으로 됐었는데, 그냥 다른 방법 하나가 새로 나온건지..
아예 안됐는데 이제 된건지....는 확실하게 모르겠네요 ㅎ
근데 아예 안된건 아닌 것 같아요..!
아무튼 바로 시작해보겠셈~~
결론부터 말하면
UIKey라는 클래스를 사용하면 됩니다.
정의는 키보드의 key상태에 대한 정보를 제공하는 객체!
UIKey는 사용자가 key를 눌렀다가 놓을 때 키보드의 현재 key 상태에 대한 관련 정보를 제공한다고 합니다.
이런 아티클도 있네요.
자, 그럼 사용자가 물리적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값을 나타내는 문자열.
바로 위 그림이 아주 좋은 예제군요.
저는 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 |
- SwiftUI
- Xcode
- swift 공부
- 회고
- Git
- Combine
- actor
- 피아노
- swift tutorial
- IOS
- np-complete
- ios 13
- swift array
- WKWebView
- 제이슨 파싱
- swift sort
- Accessibility
- Swift
- fastlane
- np-hard
- UIBezierPath
- iOS delegate
- github
- 스위프트
- swift delegate
- 스위프트 문법
- FLUTTER
- WidgetKit
- WWDC
- swift3
- Total
- Today
- Yesterday