티스토리 뷰

iOS

iOS ) Haptic Feedback

Zedd0202 2019. 4. 10. 16:02
반응형


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

어제 Feedback HIG를 읽어봤는데요, 이걸 이제 쓰는 법을 알아야겠죠?

Feedback중에서도 Haptic Feedback을 사용해보는 방법을 공부해볼게요.

Animation and Haptics에 가보면



요런 섹션이 있씁니다. 


자자 HIG를 읽고 오셨다면..위 그림을 잘 살펴보면 익숙한 단어?들이 보이실텐데요, 

바로 Impact, Notification, Selection입니다.

햅틱 피드백에 "타입"이 있다고 그랬죠? 그 타입이 위 3개였는데 각각 클래스로 있는것을 볼 수 있네요.


UI / type / Feedback / Generator 


그러니까 이름만 봐도 알 수 있듯이..해당type피드백을 Generator시켜주는 클래스겠죠? 

그리고 가장위에 부모라고 해야하나 암튼 UIFeedbackGenerator가 있고  아래 3개는 이 UIFeedbackGenerator를 상속받겠네요. 


그럼 UIFeedbackGenerator부터 봐야겠죠?


UIFeedbackGenerator

모든 Feedback Generator의 추상 슈퍼클래스(abstract superclass)입니다.


항상 추상 슈퍼클래스...에서는 하는 말이 뻔합니다.

Do not subclass or create instances of this class yourself. 

(이 클래스의 인스턴스를 직접 서브클래싱 하거나 작성하지 마세요.) 

Photos에서도 PHObject가 그랬죠ㅕ..


그리고 그 뒤에 꼭 따라오는 말

Instead, instantiate one of the provided concrete subclasses. 

(대신에, 제공된 구체적인 하위 클래스 중 하나를 인스턴스화 하세요.)


당연히 이 하위 클래스는


UIImpactFeedbackGenerator

UISelectionFeedbackGenerator

UINotificationFeedbackGenerator


를 말하는 거겠죠?


아니 이 순서가 계속 다른게 좀 거슬리네.

HIG랑 저 위에 그림이랑 지금 Overview랑 셋이 순서 다 달라...

이런거 저만 거슬리나욥,,


암튼 하나씩 봅시다. Overview에서 소개하는 순서대로 볼게요.


UIImpactFeedbackGenerator

충격(impact)이 발생했음으로 나타내기위해 impact feedback generators를 사용하세요. 예를들어, 사용자 인터페이스 객체가 무언가와 충돌하거나 제자리에 들어갈때 impact feedback를 트리거 할 수 있습니다.


UISelectionFeedbackGenerator

selection feedback generators를 사용하여 선택 변경을 나타냅니다.


UINotificationFeedbackGenerator

notification feedback generators를 사용하여 성공, 실패 및 경고를 나타냅니다.


HIG에서 보던거랑 똑같네염


Using Feedback Generators

햅틱 피드백은 주의력을 끌고, 행동과 이벤트를 강화하는 Tap과같은 촉각반응을 제공합니다. 시스템 제공 인터페이스 요소 (ex. picker, switch 및 slider)는 햅틱 피드백을 자동으로 제공하지만, Feedback Generator를 사용하여 사용자 정의 view 및 control에 custom 피드백을 추가할 수 있습니다.


팁 : 햅틱 피드백과 사운드를 포함시키려면 수동으로 사운드를 재생하고 햅틱과 동기화해야합니다.


네 하라면 해ㅑ죠..



피드백을 줄 때.


- 항상 의도된 목적을 위해 피드백을 사용하세요. 

- 피드백의 출처는 명확해야합니다. 피드백은 놀랄만한 일이되어서는 안됩니다.

- 피드백을 과용하지마세요. 


HIG내용의 요약본이네요.


사용하는 법 언제나옴

지금나옵니다.


feedback generator를 사용하려면 다음과 같은것들이 필요합니다.


1. Instantiating the Generator(Generator를 인스턴스화하기)

2. Preparing the Generator (optional) (Generator준비)

3. Triggering Feedback (피드백 트리거)

4. Releasing the Generator (optional). (Generator 해제)


하나씩 볼까요?

Instantiating the Generator

자.. UIFeedbackGenerator은 단지 추상 슈퍼클래스였고, 인스턴스화 하려면 하위클래스들로 해야겠죠?

3개가 있었던거 기억하시죠!?

 UIImpactFeedbackGenerator, UISelectionFeedbackGenerator,  UINotificationFeedbackGenerator중 하나를 인스턴스화 합니다.


Preparing the Generator

generator 준비하면, 피드백을 트리거 할떄 지연(latency) 줄일 있습니다. 피드백을 사운드 또는 시각적 단서에 일치시키려고 특히 중요합ㄴ다.

generator prepare()메소드를 호출하면, Taptic Engine 준비상태가 됩니다.

Taptic Engine 전력을 보존하기 위해 단시간(초단위) 동안, 또는 다음에 피드백을 트리거 때까지 상태(prepare) 유지합니다.

언제 어디서 generator 준비 있을지 생각해보세요. 

prepare() 호출 피드백을 즉시 트리거하면, 시스템에 Taptic Engine 준비된 상태로 만들 충분한 시간이 없으므로 (지연)시간이 줄어들지 않을 있습니다. (아하..) 

반면에 prepare() 너무 일찍 호출하면 피드백을 트리거하기전에 Taptic Engine 다시 idle(쉬고있는)상태가 있습니다.

Triggering Feedback 보기전에, prepare() 먼저 자세히 보도록 할게요.


prepare

위에서 말했듯이, Feedback 트리거하기 위해 generator 준비하는 메소드입니다.

prepare메소드를 호출하면 generator 짧은 시간동안 prepare상태가 됩니다. generator prepare상태인 동안에는, 적은 대기시간으로 피드백을 트리거 있습니다.


generator 가장 prepare 있을 때를 생각해보세요.

피드백을 유발하는 이벤트 전에, prepare() 호출하세요. 시스템은 최소한의 대기시간을 위해 Taptic Engine 준비 시간이 필요합니다.

power 절약하기 위해 다음 이벤트 하나가 발생 Taptic Engine idle상태로 돌아갑니다.

- generator 피드백을 트리거

- 짧은시간(일반적으로 초단위) 지났을

- generator deallocated


prepare()메소드를 반복적으로 호출하여 prapare상태를 확장(extend) 수도 있습니다. 그러나 피드백을 트리거하지않고, prepare() 계속 호출하면 결국 시스템은 idle상태로 돌아가고 적어도 이상 피드백을 트리거 까지 추가 prepare() 호출을 무시 있습니다. 



Note:

prepare()메소드는 선택사항입니다만, 적극 추천합니다. 



Triggering Feedback

feedback generator하위클래스에는 고유한 트리거링 메소드가 있습니다. 피드백을 트리거하려면 impactOccurred(), selectionChanged(), 또는 notificationOccurred(_:) 같은 적절한 메소드를 호출하세요.


메소드를 호출해도 햅틱을 "직접" 재생할 수는 없습니다. 대신 시스템에 이벤트를 알립니다. 

그런 다음, 시스템은 디바이스, 앱의 상태, 배터리 잔량 기타요소를 기반으로 햅틱을 재생할지 여부를 결정합ㄴ다.


예를들어, 햅틱 피드백은 다음과 같을때만 play됩니다. 

- Taptic Engine 지원되는 디바이스

- 앱이 foreground에서 실행중일

- 시스템 햅틱 세팅이 enable상태일


일반적으로 시스템을 신뢰하여 피드백을 재생해야하는지 여부를 결정하세요.

디바이스 타입이나 상태를 점검하여 피드백을 조건부로 트리거하지마세요. < 중요!!!!

피드백을 사용할 방법을 결정한 후에는 항상 적절한 이벤트가 발생할 트리거 하세요.

시스템은 이행 없는 요청은 무시합니다


Releasing the Generator

준비된 generator가 더이상 필요하지 않으면, generator객체에 대한 모든 참조를 제거하고, 시스템에서 할당을 해제하세요. 그러면 Taptic Engine이 idle상태로 돌아갑니다.




자..이 4가지 스텝을 글로 쭉 봤는데, 예제를 보면 더 이해가 잘 가겠죠?


흠..타입 중에서 뭘 먼저 보면 좋을까요.

아 HIG순서 그니까 Noti -> Impact -> Selection순서가 딱 머리에 박혀서zz HIG순서로 간다.


자. 실습(?)을 시작하기 전에, 본인의 폰이 7미만이다........그럼 수고 ㅎㅎ

7이상만...햅틱 피드백을 느낄 수 있을겁니다. 이 점 꼭!! 유의해주세요.


Notification

문서가 뭐부터 해야하는지 알려줬었죠?

1. Instantiating the Generator(Generator를 인스턴스화하기)

2. Preparing the Generator (optional) (Generator준비)

3. Triggering Feedback (피드백 트리거)

4. Releasing the Generator (optional). (Generator 해제)


해봅시다.

Instantiating the Generator(Generator를 인스턴스화하기) 및 Preparing the Generator (optional) (Generator준비)

우린 지금 Notification이니까..Notification Generator를 만들어줍시다.




feedbackGenerator라는 네이밍은...Apple예제가 이렇게 하길래..

setupGenerator에서 UINotificationFeedbackGenerator를 init해주고, prepare()를 호출시켜 준비상태로 만들어줍니다.


prepare는 위에서 말했듯이..본인 프로젝트에 맞게 준비 할 "때"를 잘 보시고 알아서 하면 됩니다. 

자 그리고 



저는 그냥 버튼.......으로 해줬습니당.

그리고 각각 누르면 햅틱 피드백 받을 수 있게 했음

시뮬레이터로 돌려도 아무 피드백 받을 수 없습니다,,?

7이상 디바이스에서만 돌려주세욘


사실 setup시 prepare를 하든 안하든 큰 지연은 느껴지지않아요.

그냥 똑같음..하지만 좋다니까 해줍시다?


이제 남은 Impact랑 selection도 똑같아요!

이거도 해야하나?

Impact는 쫌 쓰는 방법이 Notification과 아주 조금 다릅니다..


notification같은 경우에는 그냥 init을 ~generator()로 해주고


notification이 일어날 때 type을 지정해주는거였다면..impact는

이렇게 생성시에 style을 넣어주게 되어있습니다.

heavy, medium, light가 있고, 차이는 진동의 세기?입니다. 


사실

이것도 됩니다.

그럼 여기서 궁금증 그럼 진동의 세기는 셋중에 모가되냐..

제 느낌상 medium인것같음.

아니 그럼 문서에 기본 Feedback Style이라고 적어놔야할거아냐

밑에 프로젝트 링크 올려놓을테니까,,, 한번 해보세요. 제 손은 medium과 같다고 느꼈음..


아 충격적인거 발견,,,,


.....아니...


....


스페이스,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,


아니 나 너무 예민하구나,,,그래 그럴 수 있지 근데 API Design Guidelines에 안나와있나...? 빠져가지고..하고 봤더니


사실 : 양쪽에 space를 쓰지마라는 /swift-style-guide에 나와있는 



가이드구요, 제가 지금 찾아봤는데 Swift에서는, 그러니까 Apple에서 권장하는 colon space에 관한 가이드는 없네요.

Swift Standard library소스 보시면



extension에 where에 타입 강제 해줄때는 양쪽에 스페이스를 두는 것 같네요?


그리고 몇개 보니까..





음 뭔가를 상속받을 때는 양쪽에 스페이스를 주는 것  같아요. 그리고 그 안의 stored 프로퍼티나..함수의 매개변수에는 스페이스를 안주는 것 같아요.

Apple도 나름의 규칙이 있는 것 같습니당...!!!


그러니까 누가 


저기요 콜론 양 옆에 스페이스 쓰는거 아니에요;;; 이러면

어쩌라고;; 아는척 ㄴㄴ해주시면 됩니당 ㅎ_ㅎ 

저두 반성반성 OTL 


raywenderlich의 가이드가 틀렸다!!! 아니다!! 이건 절대 아니그여ㅛ 전 이미 오른쪽만 스페이스를 준다에 너무 익숙해져서..계속 이렇게 할 것 같네요.

아니 이런 흐름이라면



자동으로 만들어질때도 양옆에 스페이스 있어야 하는거 아냐?,.,,


암튼...근데 제가 잘 못봤을지도 모르니까!!! Apple에서 권장하는 colon space정책이 있다면 알려주시면 감사하겠어요. 

암튼 좀 이야기가 딴데로 샜는데


깔끔하게 마지막으로 Selection하고 끝냅시다.



이렇게 해주면 되고

느낌상 Impact의 ultra light느낌......light보다 더 가벼운 느낌의 진동이에요.


암튼 쓰는거 넘나리 간단해서 뭐 할게없네


깃헙 링크 https://github.com/Zedd0202/Haptic-Feedback



반응형