Haptic Feedback 이 지원되는 아이폰 디바이스라면 코드를 통해서 사용자에게 피드백을 줄 수가 있다.
애플의 User interaction guide에 따르면, 적절한 햅틱 피드백은 사용자 경험을 증대시켜 줄 수 있다고 한다.
코드로 피드백을 발생시키는 방법은 굉장히 간단한데, 애플의 Developer guide에 따르면, 추상 클래스로 UIFeedbackGenerator가 있고, feedback 에 대한 전반적인 설명을 제공한다.
우리가 사용할 수 있는 실제 구현된 클래스는 다음의 세가지가 있다.
– UIImpactFeedbackGenerator: 말그대로 사용자가 인지할 수 있는 충돌(?)이 발생했을 때 사용하는게 좋다고 한다.
– UISelectionFeedbackGenerator: UI상 어떤 선택(?)이 발생했을 때 사용하는게 좋다고 한다. Youtube app의 경우 Feed 에서 자동재생이 넘어가는 경우에 이 피드백을 발생시키는 것 같다.
– UINotificationFeedbackGenerator: 이벤트의 성공, 실패, 경고 등을 피드백할 경우 사용하는 게 좋다고 한다.
애플의 가이드에 따르면 위의 세 가지 Generator 중 하나를 적절한 상황에 맞게 사용하면 되는데, 아래의 절차를 따르길 권장한다.
1. instantiate
2. ~Generator.prepare()
3. triger
4. release
위 절차 중 2번과 4번은 필수는 아닌데, prepare의 경우에는 시스템의 햅틱 엔진이 idle에서 prepare 상태로 진입할 수 있도록 도와준다고 하며 이 경우에는 feedback의 발생 지연을 최소화시켜 줄 수 있다고 한다.
애플의 예제는 아래와 같다.
var feedbackGenerator : UISelectionFeedbackGenerator? = nil @IBAction func gestureHandler(_ sender: UIPanGestureRecognizer) { switch(sender.state) { case .began: // Instantiate a new generator. feedbackGenerator = UISelectionFeedbackGenerator() // Prepare the generator when the gesture begins. feedbackGenerator?.prepare() case .changed: // Check to see if the selection has changed... if myCustomHasSelectionChangedMethod(translationPoint: sender.translation(in: view)) { // Trigger selection feedback. feedbackGenerator?.selectionChanged() // Keep the generator in a prepared state. feedbackGenerator?.prepare() } case .cancelled, .ended, .failed: // Release the current generator. feedbackGenerator = nil default: // Do Nothing. break } }
대부분의 UI가 그렇듯이 햅틱 피드백도 마찬가지로 너무 과하게 남발할 경우 사용자에게 되려 불편함을 초래할 수 있을 것 같다.
앱이 시스템 엔진을 트리거하여 사용하는 것이므로, 시스템이 판단하여 저전력 상태 혹은 지원하지 않는 디바이스, 사용자가 햅틱 피드백 엔진을 사용하지 않는 경우 등에는 동작하지 않는다고 한다.
코드를 만드는 사람은 이러한 케이스를 전혀 고려하지 않고 triger를 해도 앱에 전혀 문제가 없도록 설계되어 있는 듯 하다.
적절한 상황에서 적절한 피드백을 통해 사용자 경험을 확대시킬 수 있는 지점을 찾는게 구현보다 더 중요한 것 같다.
UIFeedbackGenerator와 관련된 자세하고 정확한 내용은 애플 가이드문서를 참조하길 추천한다.