Generar un haptic feedback para mejorar la accesibilidad

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:

  1. UIImpactFeedbackGenerator: "Utiliza generadores de feedback 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".
  2. UISelectionFeedbackGenerator: "Utiliza generadores de feedback de selección para indicar un cambio en la selección".
  3. UINotificationFeedbackGenerator: "Utiliza generadores de feedback 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 = 0
case medium = 1
case 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 = 0
case warning = 1
case 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.

Comparte este artículo

Subscríbete a nuestro Newsletter

Mantente al día en el mundo de las aplicaciones móviles con nuestro blog especializado.

Artículos semanales

Todas las semanas artículos nuevos sobre el mundo de las aplicaciones móviles.

No spam

No te enviaremos spam, solo contenido de calidad. Puedes darte de baja cuando quieras.

Contenido de calidad

Nada de contenido generado de manera automática usando ChatGPT.

Recomendaciones

Tips indispensables sobre mejores prácticas y metodologías.

© 2024 AsyncLearn