post Image
UIFeedbackGeneratorをiOS10未満対応アプリで楽に書けるUtility

UIFeedbackGenerator

iOS10にてUIFeedbackGeneratorというAPIが追加されています。

“iOS10 + iPhone7のTapticEngine” をアプリ内から操作できるAPIです。
iPhone7だと UISwitchやUIScrollViewなどの操作時に「パコッ!」というフィードバックがありますよね。あれっす。

iOS10の時だけ実行されるUIFeedbackGeneratorのラッパークラスを作りました

これを自分のプロジェクトにも導入しようと思いましたがiOS10未満もサポートしているため都度 #availableが必要になってしまいます。
もう少し気軽にフィードバックを追加していきたいなと思ったので、
ややdynamicな感じですがiOS10の時だけ実行されるUIFeedbackGeneratorのラッパーAPIを用意してみました。

使い方はこんな感じ

// Notification
NotificationFeedbacker().feedback(style: .success)

// Impact
ImpactFeedbacker(style: .heavy).feedback()

// Selection
SelectionFeedbacker()

ソースコード

以下ソースコードです。

import UIKit

public final class ImpactFeedbacker {

  public enum Style {
    case light
    case medium
    case heavy
  }

  @available(iOS 10.0, *)
  private var feedbackGenerator: UIImpactFeedbackGenerator? {
    get {
      return feedbackGeneratorSource as? UIImpactFeedbackGenerator
    }
    set {
      feedbackGeneratorSource = newValue
    }
  }

  private var feedbackGeneratorSource: Any?

  public init(style: Style) {
    if #available(iOS 10.0, *) {
      switch style {
      case .light:
        feedbackGenerator = UIImpactFeedbackGenerator(style: .light)
      case .medium:
        feedbackGenerator = UIImpactFeedbackGenerator(style: .medium)
      case .heavy:
        feedbackGenerator = UIImpactFeedbackGenerator(style: .heavy)
      }
      feedbackGenerator?.prepare()
    } else {
      feedbackGeneratorSource = nil
    }
  }

  public func feedback() {
    if #available(iOS 10.0, *) {
      feedbackGenerator?.impactOccurred()
      feedbackGenerator?.prepare()
    } else {
    }
  }
}

public final class SelectionFeedbacker {

  @available(iOS 10.0, *)
  private var feedbackGenerator: UISelectionFeedbackGenerator? {
    get {
      return feedbackGeneratorSource as? UISelectionFeedbackGenerator
    }
    set {
      feedbackGeneratorSource = newValue
    }
  }

  private var feedbackGeneratorSource: Any?

  public init() {
    if #available(iOS 10.0, *) {
      feedbackGenerator = UISelectionFeedbackGenerator()
      feedbackGenerator?.prepare()
    } else {
      feedbackGeneratorSource = nil
    }
  }

  public func feedback() {
    if #available(iOS 10.0, *) {
      feedbackGenerator?.selectionChanged()
      feedbackGenerator?.prepare()
    } else {
    }
  }
}

public final class NotificationFeedbacker {

  public enum Style {
    case success
    case warning
    case error
  }

  @available(iOS 10.0, *)
  private var feedbackGenerator: UINotificationFeedbackGenerator? {
    get {
      return feedbackGeneratorSource as? UINotificationFeedbackGenerator
    }
    set {
      feedbackGeneratorSource = newValue
    }
  }

  private var feedbackGeneratorSource: Any?

  public init() {
    if #available(iOS 10.0, *) {
      feedbackGenerator = UINotificationFeedbackGenerator()
      feedbackGenerator?.prepare()
    } else {
      feedbackGeneratorSource = nil
    }
  }

  public func feedback(style: Style) {
    if #available(iOS 10.0, *) {
      switch style {
      case .success:
        feedbackGenerator?.notificationOccurred(.success)
      case .warning:
        feedbackGenerator?.notificationOccurred(.warning)
      case .error:
        feedbackGenerator?.notificationOccurred(.error)
      }
      feedbackGenerator?.prepare()
    } else {
    }
  }
}

https://gist.github.com/muukii/09d1829e1f7d686a47310b9dabf75104

補足

「パコッ!」 が気持ちよすぎて全てのボタンに追加したくなってしまいますが、そういうわけにはいかないんですね。

Appleのガイドラインには適切な使い方が記述されていました。

https://developer.apple.com/ios/human-interface-guidelines/interaction/feedback/#haptics

まとめ

パコッ!


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。