Skip to content

UIFeedbackGenerator

sustainable-git edited this page Nov 16, 2021 · 1 revision

UIFeedbackGenerator(Haptic Feedback)


종류

  • UIFeedbackGenerator

    • 상위 클래스임
    • Subclass 혹은 생성하여 직접 사용하지 말고 하위 클래스를 사용할 것
  • UIImpactFeedbackGenerator

    • 충돌이 일어났을 때에 사용
  • UISelectionFeedbackGenerator

    • 선택에 대한 피드백을 줄 때에 사용
  • UINotificationFeedbackGenerator

    • 성공, 실패, 오류 등의 피드백을 줄 때에 사용

사용 방법

  • Instance 만들기

    • feedbackGenerator = UISelectionFeedbackGenerator()
  • 준비(Optional)

    • feedbackGenerator?.prepare()
  • 동작

    • feedbackGenerator?.selectionChanged()
  • 해제(Optional)

    • feedbackGenerator = nil

Prepare를 하지 않으면

  • 반응 속도가 느려질 수 있다

테스트


느낀점

  • 사용할 만한 것은 SelectionFeedback과 NotificationFeedback

    • 약한 입력이 필요할 때는 SelectionFeedback을 사용하면 좋을 것 같다

    • 강한 입력이 필요할 때에는 NotificationFeedback을 사용하면 좋을 것 같다

      • success, warning는 미묘하게 다름
      • error는 여러번 진동함
  • ImpactFeedback은 heavy, medium, light, rigid, soft의 차이가 없음

    • 작동하는게 몇 없고, 동작이 동일함

      • greatestFiniteMagnitude
      • infinity
      • pi
    • 나머지 6개는 진동이 없음


소스코드

//
//  ViewController.swift
//  SwiftAppTest
//
//  Created by shin jae ung on 2021/11/16.
//

import UIKit

class ViewController: UIViewController {
    var notificationFeedbackGenerator = UINotificationFeedbackGenerator()
    var heavyImpactFeecbackGenerator = UIImpactFeedbackGenerator(style: .heavy)
    var mediumImpactFeecbackGenerator = UIImpactFeedbackGenerator(style: .medium)
    var lightImpactFeecbackGenerator = UIImpactFeedbackGenerator(style: .light)
    var rigidImpactFeecbackGenerator = UIImpactFeedbackGenerator(style: .rigid)
    var softImpactFeecbackGenerator = UIImpactFeedbackGenerator(style: .soft)
    @IBOutlet weak var stepper: UIStepper!
    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        stepperTouched(nil)
    }

    @IBAction func stepperTouched(_ sender: UIStepper?) {
        switch stepper.value {
        case 0: label.text = "heavy"
        case 1: label.text = "medium"
        case 2: label.text = "light"
        case 3: label.text = "rigid"
        case 4: label.text = "soft"
        default: label.text = "error"
        }
    }
    private func currentGenerator() -> UIImpactFeedbackGenerator {
        switch stepper.stepValue {
        case 0: return heavyImpactFeecbackGenerator
        case 1: return mediumImpactFeecbackGenerator
        case 2: return lightImpactFeecbackGenerator
        case 3: return rigidImpactFeecbackGenerator
        case 4: return softImpactFeecbackGenerator
        default: return UIImpactFeedbackGenerator()
        }
    }
    
    @IBAction func standard(_ sender: UIButton) { UISelectionFeedbackGenerator().selectionChanged() }
    @IBAction func success(_ sender: UIButton) { notificationFeedbackGenerator.notificationOccurred(.success) }
    @IBAction func warning(_ sender: UIButton) { notificationFeedbackGenerator.notificationOccurred(.warning) }
    @IBAction func error(_ sender: UIButton) { notificationFeedbackGenerator.notificationOccurred(.error) }
    @IBAction func h1(_ sender: Any) { currentGenerator().impactOccurred(intensity: .greatestFiniteMagnitude) }
    @IBAction func h2(_ sender: Any) { currentGenerator().impactOccurred(intensity: .infinity) }
    @IBAction func h3(_ sender: Any) { currentGenerator().impactOccurred(intensity: .leastNonzeroMagnitude) }
    @IBAction func h4(_ sender: Any) { currentGenerator().impactOccurred(intensity: .leastNormalMagnitude) }
    @IBAction func h5(_ sender: Any) { currentGenerator().impactOccurred(intensity: .nan) }
    @IBAction func h6(_ sender: Any) { currentGenerator().impactOccurred(intensity: .pi) }
    @IBAction func h7(_ sender: Any) { currentGenerator().impactOccurred(intensity: .signalingNaN) }
    @IBAction func h8(_ sender: Any) { currentGenerator().impactOccurred(intensity: .zero) }
    @IBAction func h9(_ sender: Any) { currentGenerator().impactOccurred(intensity: .ulpOfOne) }
}
Clone this wiki locally