ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • UIFeedbackGenerator
    iOS 2022. 3. 14. 10:44

    안녕하세요. 그린입니다🟢

    이번 포스팅에서는 UIFeedbackGenerator에 대해 학습해보겠습니다🙋🏻

    우선, 왜 이걸 학습하게 되었는지 얘기를 해볼까 합니다.
    프로젝트 수행중에 어떤 유저의 액션에 의해서 (QR이나 바코드를 찍는다던가 하는) 디바이스의 진동 혹은 사운드를 내주고 싶을 경우가 있잖아요?
    그럴때 어떠한 액션을 어떻게 구현해주는게 베스트일지 찾다가 요 UIFeedbackGenerator를 발견하고 학습하게 되었어요!
    사용법도 되게 단순하고 개념도 간단해서 금방 적용할 수 있었고 이에 대해 단순히 저는 UINotificationFeedbackGenerator만 사용했었는데 이거 말고도 UIFeedbackGenerator을 상속 받는 다른 친구들도 있길래..!
    이참에 한번 간략히 정리해보려고 이번 주제로 학습 및 포스팅 하게 되었습니다🚀

    UIFeedbackGenerator?

    우선 공식문서의 정의를 봐봅시다.

    @MainActor class UIFeedbackGenerator : NSObject

    모든 피드백 생성에 대한 추상 슈퍼클래스 입니다.

    즉 하위 클래스들이 위에서 말한 친구들이 되겠네요.

    중요한것은 이 클래스의 인스턴스를 직접 생성하거나 하위 클래스로 만들지 말라고 권고합니다!

    대신에 아까 방금 말한 요 클래스를 상속 받는 하위 클래스들 중 원하는 클래스를 사용해 인스턴스를 생성하라 합니다.

    (이건 뭐 매번 당연한 애플의 권고이니 오케이 오케이...)

    Using Feedback Generators

    오호 이 부분에서 재밌고 명확한 의도가 나옵니다.

    지금 학습하고 있는것은 진동이 오는 햅틱 피드백의 일환입니다.

    사용자의 액션에 의해서 햅틱 피드백을 통해 촉각적 반응(진동 같은)을 제공해 주의를 끌고 이벤트를 강화합니다.

    현재 애플에서 기본 제공하는 API들 중 switch, slider 같은 애들은 자동으로 이 햅틱 피드백을 제공해줍니다.

    그런데 우리가 순수 구현할 커스텀한 경우는 이 피드백을 추가해줘야 합니다.

    팁이라 나와있는건 "햅틱 피드백과 사운드를 함께 사용하려면 사운드를 수동으로 재생하고 동기화 해야 합니다" 입니다!

    다만 권고하는건 피드백을 남용하지 말라는 겁니다.

    남용하게 되면 어디서든 햅틱 피드백이 오니 어디가 중요한지 인지하지 못하게 만듭니다.

    이와 관련해서 H.I.G에 Feedback 부분의 지침을 참고해보면 좋을것 같습니다🙌

    https://developer.apple.com/design/human-interface-guidelines/ios/user-interaction/feedback/

     

    Feedback - User Interaction - iOS - Human Interface Guidelines - Apple Developer

    Feedback Feedback helps people know what an app is doing, discover what they can do next, and understand the results of actions. Unobtrusively integrate status and other types of feedback into your interface. Ideally, users can get important information wi

    developer.apple.com

    Feedback Generators 사용 생성 순서

    1. Generator(생성기) 인스턴스화

     - 위에서 말했던 하위 클래스들 중 하나를 선택해 인스턴스를 생성합니다.

     

    2. Generator 준비 (선택사항)

     - generator의 prepare() 메서드를 호출해 Taptic Engine을 준비 상태로 만듭니다.

     준비상태로 만듬으로써 피드백 트리거할 때의 대기 시간을 줄일 수 있습니다.

     사운드나 진동 및 시각적 신호를 일치 시키려고 준비할때도 좋습니다.

     

    3. Triggering Feedback

     - 트리거에 대한 피드백을 해줍니다.

     피드백을 작동 시키기 위해 하위 클래스에서 맞는 적절한 메서드를 호출해줘야 합니다.

     impactOccurred()

     selectionChanged()

     notificationOccurred(_:)

     위 제시한 3가지의 방법이 대표적으로 존재합니다.

     각 하위 클래스에서 맞는 메서드들 입니다.

     어떤 하위 클래스에서 뭐가 맞는지는 이후 나오는 하위 클래스 설명에서 살펴보시죠😀

     위 메서드를 호출해서 바로 햅틱을 직접 구동시키는건 아닙니다.

     디바이스 시스템에 이벤트를 알려 시스템에서 장치, 앱 상태, 배터리 및 기타 요소를 체크해서 햅틱을 작동할지 결정합니다.

     햅틱이 작동되는 경우는 아래와 같습니다.

    • 지원되는 Taptic Engine이 있는 디바이스
    • 앱이 foreGround 상태 일때 (활성 상태)
    • 시스템 햅틱 설정이 활성화된 경우

     일반적으로 피드백을 재생할지 여부를 결정하는 시스템을 신뢰해야 한다고 합니다.

     조건을 주어 피드백 트리거를 위해 앱 상태나 장치 유형을 확인하면 안됩니다!

     

    4. Feedback 해제

     - 꼭 필요없어진 Generator 인스턴스는 해제 해야 합니다.

     

    이렇게 사용 생성 순서를 알아 봤는데 공식문서에서 switch를 가지고 대략적으로 나타낸 코드를 한번 보시죠!

    var feedbackGenerator : UISelectionFeedbackGenerator? = nil
    @IBAction func gestureHandler(_ sender: UIPanGestureRecognizer) {
      switch(sender.state) {
      case .began:
        // 1번 - Generator 인스턴스 생성
        feedbackGenerator = UISelectionFeedbackGenerator()
        
        // 2번 - Generator 준비 (선택)
        feedbackGenerator?.prepare()
            
      case .changed:
        // 트리거 발동을 위한 조건 비교
        if  myCustomHasSelectionChangedMethod(translationPoint: sender.translation(in: view)) {
          // 3번 - 피드백 Generator 트리거 발동!
          feedbackGenerator?.selectionChanged()
         
          // 다시 준비 상태로
          feedbackGenerator?.prepare()
        }
            
      case .cancelled, .ended, .failed:
        // 4번 - Generator 인스턴스 해제
        feedbackGenerator = nil
      
      ...
      }
    }

    각 주석으로 해당 스텝을 기재해봤습니다!

    아주 간단한 스텝으로 이뤄져있습니다🙌

    UIFeedbackGenerator의 3가지 하위 클래스

     1. UIImpactFeedbackGenerator
     이 클래스는 물리적 충격에 피드백 해주는 햅틱을 생성하는 클래스입니다.

    @MainActor class UIImpactFeedbackGenerator : UIFeedbackGenerator

     당연하게도 정의를 보면 UIFeedbackGenerator을 상속받습니다.

     구현 시 임팩트에 대해 피드백의 반응 강도를 설정 할 수 있습니다.

    let generator = UIImpactFeedbackGenerator(style: .light)
    generator?.impactOccurred()

     
    이렇게 style을 통해 5가지를 선택할 수 있습니다.

    • heavy
    • light
    • medium
    • rigid
    • soft

     또한 앞서 말한 트리거를 작동시키는 메서드로 impactOccurred() 메서드를 호출하면 됩니다!

     

     2. UINotificationFeedbackGenerator

     성공, 실패 및 경고를 전달하기 위해 햅틱을 생성하는 클래스입니다.

    @MainActor class UINotificationFeedbackGenerator : UIFeedbackGenerator

     역시나 동일한 형태의 클래스 정의입니다.

     피드백 타입으로는 3가지가 있습니다.

    • success
    • error
    • warning

     또한, notificationOccurred() 메서드를 호출해 트리거를 보내줍니다.

     

     3. UISelectionFeedbackGenerator

     선택의 변경을 나타내기 위해 햅틱을 생성하는 클래스입니다.

    @MainActor class UISelectionFeedbackGenerator : UIFeedbackGenerator

     또또 역시나.. 정의는 같구요!

     selectionChanged()로 트리거를 보내줍니다.

     얘가 제일 뭐가 없이 간단하네요!

    마무리

    자 이렇게 오늘 햅틱 피드백에 대해 알아봤어요!

    오랜만에 공식문서를 하나씩 정독해가면서 파고 들어간 느낌이 있어서 좋았습니다ㅎㅎ

    햅틱 피드백.. 진짜 전혀 생소히 몰랐는데 이 간단한걸 이제 알았다니...?

    알았으니 이제 잘 활용해서 유저의 사용 경험의 수준을 높여줄 수 있겠네요😀

    [참고자료]

    https://developer.apple.com/documentation/uikit/uifeedbackgenerator

     

    Apple Developer Documentation

     

    developer.apple.com

    https://developer.apple.com/design/human-interface-guidelines/ios/user-interaction/feedback/

     

    Feedback - User Interaction - iOS - Human Interface Guidelines - Apple Developer

    Feedback Feedback helps people know what an app is doing, discover what they can do next, and understand the results of actions. Unobtrusively integrate status and other types of feedback into your interface. Ideally, users can get important information wi

    developer.apple.com

    'iOS' 카테고리의 다른 글

    애플 로그인 (Sign In with Apple)  (2) 2022.04.18
    DarkMode  (0) 2022.03.31
    링크 공유 & 이동 구현하기  (0) 2021.11.23
    Airbridge  (0) 2021.10.27
    App Tracking Transparency  (0) 2021.10.16
Designed by Tistory.