Usando buttonRepeatBehavior para interacciones repetitivas
Libranner Santos
17 julio, 20232min de lectura
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 = 0var 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.
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.