Help us understand the problem. What is going on with this article?

UIFeedbackGeneratorを簡単に使えるようにする

More than 1 year has passed since last update.

開発環境

  • Xcode10.2
  • Swift 5.0

UIFeedbackGeneratorとは

Apple公式から引用

概要
このクラスのインスタンスを自分でサブクラス化したり作成したりしないでください。代わりに、提供されている具象サブクラスの1つをインスタンス化してください。

UIImpactFeedbackGenerator。影響が発生したことを示すには、影響フィードバックジェネレータを使用します。たとえば、ユーザーインターフェイスオブジェクトが何かにぶつかったり、所定の位置に固定されたときに、インパクトフィードバックを引き起こすことがあります。

UISelectionFeedbackGenerator。選択の変化を示すために選択フィードバックジェネレータを使用します。

UINotificationFeedbackGenerator。成功、失敗、および警告を示すために通知フィードバックジェネレータを使用します。

何かのアクションのフィードバックとしてユーザさんの端末をブルッてさせてフィードバックするやつです。

通常の実装方法

UIFeedbackGeneratorの使い方と便利に使えるライブラリから引用させていただきました。

class ViewController: UIViewController {

    private let feedbackGenerator: Any? = {
        if #available(iOS 10.0, *) {
            let generator: UIImpactFeedbackGenerator = UIImpactFeedbackGenerator(style: .light)
            generator.prepare()
            return generator
        } else {
            return nil
        }
    }()

    @IBAction private func light() {
        if #available(iOS 10.0, *), let generator = feedbackGenerator as? UIImpactFeedbackGenerator {
            generator.impactOccurred()
        }
    }

各VCに記述するにはしんどいなという印象でした。

簡単に使う方法

以下の構造体でラップして利用します。

/// UIFeedbackGeneratorを簡単に利用するためのラッパー
struct Feedbacker {

  static func notice(type: UINotificationFeedbackGenerator.FeedbackType) {
    if #available(iOS 10.0, *) {
      let generator = UINotificationFeedbackGenerator()
      generator.prepare()
      generator.notificationOccurred(type)
    }
  }

  static func impact(style: UIImpactFeedbackGenerator.FeedbackStyle) {
    if #available(iOS 10.0, *) {
      let generator = UIImpactFeedbackGenerator(style: style)
      generator.prepare()
      generator.impactOccurred()
    }
  }

  static func selection() {
    if #available(iOS 10.0, *) {
      let generator = UISelectionFeedbackGenerator()
      generator.prepare()
      generator.selectionChanged()
    }
  }

}

使い方

フィードバックをさせたいところでstaticメソッドをコールします。

/// 例
override func viewDidLoad() {
  // ViewControllerの読み込みが終わったらフィードバック
  Feedbacker.notice(type: .success)
}

コールの仕方は以下になりますので用途によって使い分けてください。

// notice
Feedbacker.notice(type: .success)
Feedbacker.notice(type: .warning)
Feedbacker.notice(type: .error)

// impact
Feedbacker.impact(style: .heavy)
Feedbacker.impact(style: .light)
Feedbacker.impact(style: .medium)

// selection
Feedbacker.selection()

おわり

間違えてる部分や編集リクエストありましたらよろしくお願いいたします

xxminamixx
大学時代は情報デザインを専攻し課題解決の手段としてプログラムしてます。 iOS/Androidエンジニア。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした