[iOS] Haptic Feedback

Charlie·2022년 11월 3일
0

Feedback Generator 사용하기

Feedback Generator를 사용하려면
1. Instantiating the Generator
2. Preparing the Generator (optional)
3. Triggering Feedback
4. Releasing the Generator (optional)
를 따르면 된다.

Instantiating the Generator

먼저 UIImpactFeedbackGenerator, UINotificationFeedbackGenerator, UISelectionFeedbackGenerator 가운데 사용하려는 것을 인스턴스화 한다.

Preparing the Generator

generator를 준비하면 피드백을 실행할 때 latency를 줄일 수 있다. 피드백을 사운드 또는 시각적인 무언가와 일치시키려고 할 때 특히 중요하다.
generator의 prepare() 메소드를 호출하면 Taptic Engine이 준비상태가 되는데, 이는 전력을 보존하기 위해 단 시간(초단위) 동안, 또는 다음에 피드백을 실행할 때 까지 준비상태를 유지한다.
prepare() 메소드를 호출한 직후에 피드백을 트리거하면, 시스템이 Taptic Engine을 준비하기 위한 충분한 시간이 없으므로 latency가 줄어들지 않는다. 반대로 prepare() 메소드를 너무 일찍 호출하면 피드백을 트리거하기 전에 준비상태에서 다시 쉬고있는 idle 상태로 돌아갈 수 있다.
따라서 언제 트리거를 할지, 언제 prepare() 메소드를 호출할지를 잘 고려해야한다.
prepare() 메소드의 사용은 optional이지만, 적극 권장한다.

Triggering Feedback

인스턴스화한 Feedback Generator에 따라 impactOccurred(), selectionChanged(), notificationOccurred() 메소드를 호출하여 피드백을 트리거할 수 있다.

이 메소드를 호출해도 햅틱을 직접 실행할 수는 없고, 다만 시스템에 이벤트를 알리게 된다.
이벤트를 받은 시스템은 디바이스, 앱의 상태, 배터리 잔량 등을 고려하여 햅틱을 재생할지 여부를 결정한다.

Releasing the Generator

Feedback Generator가 더이상 필요하지 않으면, 객체에 대한 모든 참조를 제거하고 시스템에서 할당 해제하도록 하자.

Feedback Generator 종류

UIImpactFeedbackGenerator

충격이 발생했을 때 사용

  • heavy : 센 햅틱 한번
  • medium : 중간 햅틱 한번
  • light : 약한 햅틱 한번
  • rigid : 툭! 햅틱 한번 (soft와 반대되는 친구인듯)
  • soft : 투-욱 햅틱 (여러번처럼 느껴지는?)

UINotificationFeedbackGenerator

사용자게에 noti를 알려줄 때 사용

  • success : 투두둑! (크레센도)
  • error : 두둑!
  • warning : 두둑! (error랑 똑같은거 같음)

UISelectionFeedbackGenerator

선택을 할 때 사용
종류는 따로 없고 약하게 둑

Haptic Manager

import Foundation
import UIKit

final class HapticManager {
    static let instance = HapticManager()
    
    private init() {}
    
    func notification(type: UINotificationFeedbackGenerator.FeedbackType) {
        let generator = UINotificationFeedbackGenerator()
        generator.notificationOccurred(type)
    }
    
    func impact(style: UIImpactFeedbackGenerator.FeedbackStyle) {
        let generator = UIImpactFeedbackGenerator(style: style)
        generator.impactOccurred()
    }
    
    func selection() {
        let generator = UISelectionFeedbackGenerator()
        generator.selectionChanged()
    }
}

Reference

ZeddiOS - iOS ) Haptic Feedback
서근개발노트 - https://seons-dev.tistory.com/m/227

profile
Hello

0개의 댓글