Generar un haptic feedback para mejorar la accesibilidad
Marcelo Laprea
06 febrero, 20233min de lectura
Apple introdujo en iOS 10 una nueva forma de generar haptic feedback a través de unos patrones de vibración ya predefinidos por ellos. Para ello nos facilita el UIFeedbackGenerator
.
A través de la clase UIFeedbackGenerator
, Apple nos permite generar este haptic feedback al usuario generando una respuesta táctil a medida que el usuario interactúa con la app.
Para empezar, hay 3 tipos de subclase del UIFeedbackGenerator
y Apple los define como:
UIImpactFeedbackGenerator
: "Utiliza generadores defeedback
de impacto para indicar que se ha producido un impacto. Por ejemplo, puede desencadenar comentarios de impacto cuando un objeto de la interfaz de usuario choca con algo o encaja en su lugar".UISelectionFeedbackGenerator
: "Utiliza generadores defeedback
de selección para indicar un cambio en la selección".UINotificationFeedbackGenerator
: "Utiliza generadores defeedback
de notificaciones para indicar éxitos, fallas y advertencias".
Implementar el UIImpactFeedbackGenerator
Vamos a crear una estructura llamada Haptics para implementar todos los generadores, empezando por UIImpactFeedbackGenerator
:
struct Haptics {static func play(_ feedbackStyle: UIImpactFeedbackGenerator.FeedbackStyle) {let generator = UIImpactFeedbackGenerator(style: feedbackStyle)generator.prepare()generator.impactOccurred()}}
Dónde primero se instancia la subclase UIImpactFeedbackGenerator
enviando como parámetro el FeedbackStyle
.
Luego Apple nos recomienda ejecutar prepare()
para reducir la latencia al activar el feedback. Esto es particularmente importante cuando se trata de hacer coincidir la retroalimentación con señales sonoras o visuales.
Y por último ejecutar impactOccurred()
para activar el feedback.
public enum FeedbackStyle : Int, @unchecked Sendable {case light = 0case medium = 1case heavy = 2@available(iOS 13.0, *)case soft = 3@available(iOS 13.0, *)case rigid = 4}
Podemos llamar Haptics.play(.light)
de la siguiente forma:
var body: some View {Button {Haptics.play(.light)} label: {Text("Touch me")}}
Implementar el UISelectionFeedbackGenerator
Vamos a usar la misma estructura Haptics que creamos anteriormente
struct Haptics {static func notify(_ feedbackType: UINotificationFeedbackGenerator.FeedbackType) {let generator = UINotificationFeedbackGenerator()generator.prepare()generator.notificationOccurred(feedbackType)}}
Mismos pasos que el anterior, pero esta vez enviando como parámetro el FeedbackType
public enum FeedbackType : Int, @unchecked Sendable {case success = 0case warning = 1case error = 2}
Aquí se puede decidir que tipo de feedback enviar, dependiendo del lugar en donde se envíe el feedback. Intenta probar los 3 tipos.
Podemos usar el notify()
igual como usamos el play()
.
var body: some View {Button {Haptics.notify(.success)} label: {Text("Touch me")}}
Implementar el UINotificationFeedbackGenerator
Por último, para implementar el UINotificationFeedbackGenerator
, seguimos los mismos pasos que el anterior, pero esta vez llamando generator.selectionChanged()
.
struct Haptics {static func notifyChange() {let generator = UISelectionFeedbackGenerator()generator.prepare()generator.selectionChanged()}}
Y hacemos uso del notifyChange()
igual que los anteriores
var body: some View {Button {Haptics.notifyChange()} label: {Text("Touch me")}}
Gracias a haptic feedback podemos mejorar la accesibilidad de nuestra app, añadiendo pequeñas vibraciones cada vez que el usuario interactúe con algún elemento de la app.