Usando buttonRepeatBehavior para interacciones repetitivas

En ocasiones necesitamos ofrecer a los usuarios la capacidad de interactuar con botones de maneras muy específicas. Hasta este momento SwiftUI no proveía una forma de realizar acciones repetitivas cuando un usuario deja presionado un botón. Sin embargo, con iOS 17 ya podemos ofrecer esta funcionalidad usando buttonRepeatBehavior(_:).

struct Sample: View {
@State private var counter = 0
var body: some View {
VStack {
Text("\(counter)")
Button {
counter += 1
} label: {
Label("Increment", systemImage: "plus.circle.fill")
}
.buttonRepeatBehavior(.enabled)
}
.font(.largeTitle)
}
}

En este view, tenemos un Text que muestra el valor de la variable privada counter. También contamos con un botón que incrementa counter cuando es presionado. Este botón tiene la particularidad de que cuenta con el modificador .buttonRepeatBehavior(.enabled).

Cuando presionamos el botón una sola vez vemos cómo counter se incrementa en uno, sin embargo, si dejamos el botón presionado de manera prolongada veremos cómo sigue aumentándose.

Ejemplo de como se comporta un botón con buttonRepeatBehavior habilitado

Este modificador puede ser usado en aplicaciones para macOS, por lo que interacciones como mantener presionada la barra de espacio tendrán el mismo efecto que dejar el botón presionado directamente.

Tipos de comportamiento

El modificador buttonRepeatBehavior(_:) acepta uno de los siguientes valores:

  • enabled: el que usamos en el ejemplo y el cual provoca que el comportamiento de repetición se active.
  • automatic: este es el valor por defecto, se elegirá el comportamiento basado en el contexto.
  • disabled: desactiva el comportamiento.

Variable de entorno

SwiftUI nos provee una variable de entorno para que podamos verificar el valor de buttonRepeatBehavior a nivel global. Para esto declaramos la variable de esta forma en nuestra vista:

@Environment(\.buttonRepeatBehavior) private var behavior

Así podemos acceder al valor que tenemos por defecto y tomar acciones basados en el mismo. Por el momento, no está permitido cambiar estos valores directamente. Si intentamos hacer lo siguiente:

struct AsyncLearnApp: App {
var body: some Scene {
WindowGroup {
Sample()
.environment(\.buttonRepeatBehavior, .enabled)
}
}
}

Recibiremos el error:

Key path value type 'WritableKeyPath<EnvironmentValues, ButtonRepeatBehavior>' cannot be converted to contextual type 'KeyPath<EnvironmentValues, ButtonRepeatBehavior>'

Esto quiere decir que no podemos cambiar este valor de forma global, sin embargo, esto podría cambiar una vez tengamos la versión oficial de iOS 17 y Xcode 15.

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