Unify haptic feedback

Closes #154
This commit is contained in:
Shadowfacts 2023-01-26 21:28:56 -05:00
parent f1facea929
commit edd1e55cbb
6 changed files with 21 additions and 14 deletions

View File

@ -0,0 +1,7 @@
# Haptic Feedback
## Selection changed
`UISelectionFeedbackGenerator`
## Actions
On success, `UIImpactFeedbackGenerator` with the `.light` style. On error, `UINotificationFeedbackGenerator` with the `.error` type.

View File

@ -62,7 +62,7 @@ public class DuckableContainerViewController: UIViewController, DuckableViewCont
guard case .idle = state else { guard case .idle = state else {
if animated, if animated,
case .ducked(_, placeholder: let placeholder) = state { case .ducked(_, placeholder: let placeholder) = state {
UIImpactFeedbackGenerator(style: .soft).impactOccurred() UIImpactFeedbackGenerator(style: .light).impactOccurred()
let origConstant = placeholder.topConstraint.constant let origConstant = placeholder.topConstraint.constant
UIView.animateKeyframes(withDuration: 0.4, delay: 0) { UIView.animateKeyframes(withDuration: 0.4, delay: 0) {
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5) { UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5) {

View File

@ -24,7 +24,7 @@ class FastAccountSwitcherViewController: UIViewController {
private(set) var accountViews: [FastSwitchingAccountView] = [] private(set) var accountViews: [FastSwitchingAccountView] = []
private var lastSelectedAccountViewIndex: Int? private var lastSelectedAccountViewIndex: Int?
private var selectionChangedFeedbackGenerator: UIImpactFeedbackGenerator? private var selectionChangedFeedbackGenerator: UISelectionFeedbackGenerator?
private var touchBeganFeedbackWorkItem: DispatchWorkItem? private var touchBeganFeedbackWorkItem: DispatchWorkItem?
var itemOrientation: ItemOrientation = .iconsTrailing var itemOrientation: ItemOrientation = .iconsTrailing
@ -148,7 +148,7 @@ class FastAccountSwitcherViewController: UIViewController {
private func switchAccount(newIndex: Int, hapticFeedback: Bool = true) { private func switchAccount(newIndex: Int, hapticFeedback: Bool = true) {
if newIndex == 0 { // add account placeholder if newIndex == 0 { // add account placeholder
if hapticFeedback { if hapticFeedback {
selectionChangedFeedbackGenerator?.impactOccurred() selectionChangedFeedbackGenerator?.selectionChanged()
} }
selectionChangedFeedbackGenerator = nil selectionChangedFeedbackGenerator = nil
@ -160,7 +160,7 @@ class FastAccountSwitcherViewController: UIViewController {
if account.id != LocalData.shared.mostRecentAccountID { if account.id != LocalData.shared.mostRecentAccountID {
if hapticFeedback { if hapticFeedback {
selectionChangedFeedbackGenerator?.impactOccurred() selectionChangedFeedbackGenerator?.selectionChanged()
} }
selectionChangedFeedbackGenerator = nil selectionChangedFeedbackGenerator = nil
@ -178,8 +178,8 @@ class FastAccountSwitcherViewController: UIViewController {
@objc private func handleLongPress(_ recognizer: UIGestureRecognizer) { @objc private func handleLongPress(_ recognizer: UIGestureRecognizer) {
switch recognizer.state { switch recognizer.state {
case .began: case .began:
selectionChangedFeedbackGenerator = UIImpactFeedbackGenerator(style: .medium) UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
selectionChangedFeedbackGenerator?.impactOccurred() selectionChangedFeedbackGenerator = UISelectionFeedbackGenerator()
selectionChangedFeedbackGenerator?.prepare() selectionChangedFeedbackGenerator?.prepare()
show() show()
@ -231,7 +231,7 @@ class FastAccountSwitcherViewController: UIViewController {
lastSelectedAccountViewIndex = selectedAccountViewIndex lastSelectedAccountViewIndex = selectedAccountViewIndex
if hapticFeedback { if hapticFeedback {
selectionChangedFeedbackGenerator?.impactOccurred(intensity: 0.5) selectionChangedFeedbackGenerator?.selectionChanged()
selectionChangedFeedbackGenerator?.prepare() selectionChangedFeedbackGenerator?.prepare()
} }
} }
@ -260,7 +260,7 @@ class FastAccountSwitcherViewController: UIViewController {
// if the user is merely tapping, not initiating a pan, we don't want to trigger a double-impact // if the user is merely tapping, not initiating a pan, we don't want to trigger a double-impact
// if the tap ends very quickly, this will be cancelled // if the tap ends very quickly, this will be cancelled
touchBeganFeedbackWorkItem = DispatchWorkItem { touchBeganFeedbackWorkItem = DispatchWorkItem {
self.selectionChangedFeedbackGenerator?.impactOccurred(intensity: 0.5) self.selectionChangedFeedbackGenerator?.selectionChanged()
self.selectionChangedFeedbackGenerator?.prepare() self.selectionChangedFeedbackGenerator?.prepare()
self.touchBeganFeedbackWorkItem = nil self.touchBeganFeedbackWorkItem = nil
} }

View File

@ -146,7 +146,7 @@ class FollowRequestNotificationTableViewCell: UITableViewCell {
do { do {
_ = try await mastodonController.run(request) _ = try await mastodonController.run(request)
UINotificationFeedbackGenerator().notificationOccurred(.success) UIImpactFeedbackGenerator(style: .light).impactOccurred()
self.actionButtonsStackView.isHidden = true self.actionButtonsStackView.isHidden = true
self.addLabel(NSLocalizedString("Rejected", comment: "rejected follow request label")) self.addLabel(NSLocalizedString("Rejected", comment: "rejected follow request label"))
} catch let error as Client.Error { } catch let error as Client.Error {
@ -172,7 +172,7 @@ class FollowRequestNotificationTableViewCell: UITableViewCell {
do { do {
_ = try await mastodonController.run(request) _ = try await mastodonController.run(request)
UINotificationFeedbackGenerator().notificationOccurred(.success) UIImpactFeedbackGenerator(style: .light).impactOccurred()
self.actionButtonsStackView.isHidden = true self.actionButtonsStackView.isHidden = true
self.addLabel(NSLocalizedString("Accepted", comment: "accepted follow request label")) self.addLabel(NSLocalizedString("Accepted", comment: "accepted follow request label"))
} catch let error as Client.Error { } catch let error as Client.Error {

View File

@ -26,7 +26,7 @@ class PollOptionsView: UIControl {
private let animationDuration: TimeInterval = 0.1 private let animationDuration: TimeInterval = 0.1
private let scaledTransform = CGAffineTransform(scaleX: 0.95, y: 0.95) private let scaledTransform = CGAffineTransform(scaleX: 0.95, y: 0.95)
private let generator = UIImpactFeedbackGenerator(style: .soft) private let generator = UISelectionFeedbackGenerator()
override var isEnabled: Bool { override var isEnabled: Bool {
didSet { didSet {
@ -110,7 +110,7 @@ class PollOptionsView: UIControl {
} }
animator.startAnimation() animator.startAnimation()
generator.impactOccurred() generator.selectionChanged()
generator.prepare() generator.prepare()
return true return true
@ -139,7 +139,7 @@ class PollOptionsView: UIControl {
} }
if newIndex != nil { if newIndex != nil {
generator.impactOccurred() generator.selectionChanged()
generator.prepare() generator.prepare()
} }
} }

View File

@ -148,7 +148,7 @@ class StatusPollView: UIView {
voteButton.isEnabled = false voteButton.isEnabled = false
voteButton.disabledTitle = "Voted" voteButton.disabledTitle = "Voted"
UIImpactFeedbackGenerator(style: .medium).impactOccurred() UIImpactFeedbackGenerator(style: .light).impactOccurred()
let request = Poll.vote(poll!.id, choices: optionsView.checkedOptionIndices) let request = Poll.vote(poll!.id, choices: optionsView.checkedOptionIndices)
mastodonController.run(request) { (response) in mastodonController.run(request) { (response) in