Botones en SwiftUI: Segunda Parte – Técnicas Intermedias
En la primera parte aprendiste a crear y personalizar botones básicos en SwiftUI. Ahora vamos a llevar tus habilidades al siguiente nivel con técnicas intermedias, perfectas para que tus botones sean más interactivos, accesibles y visualmente atractivos.

¿Qué aprenderás en este tutorial?
- Responder a gestos avanzados
- Animar botones al interactuar
- Crear botones con estados personalizados (toggle, loading)
- Personalizar botones con imágenes propias
- Accesibilidad en botones
- Componer botones reutilizables
1. Respondiendo a Gestos Avanzados
¿Sabías que los botones no solo responden a un simple toque? Puedes detectar gestos como un doble toque para ofrecer más opciones al usuario.
Doble toque (Double Tap)
Aunque no existe un modificador directo para doble toque en Button, puedes envolver el botón en un onTapGesture(count:):
SWIFTButton("Doble Toca Aquí") { print("¡Toque detectado!") } .padding() .background(Color.orange) .cornerRadius(10) .onTapGesture(count: 2) { print("¡Doble toque detectado!") }

2. Animando Botones
Las animaciones hacen que tu app se sienta viva y moderna. Puedes animar cambios de color, escala o rotación cuando el usuario interactúa con un botón.
Animación de escala al pulsar
SWIFTstruct AnimatedButton: View { @State private var pressed = false var body: some View { Button("¡Anímame!") { // Acción normal } .scaleEffect(pressed ? 1.2 : 1.0) .animation(.spring(), value: pressed) .onLongPressGesture(minimumDuration: 0.1, pressing: { inProgress in pressed = inProgress }, perform: {}) } }

3. Botones con Estado Personalizado
A veces, un botón necesita mostrar un estado, como "activo/inactivo" o "cargando".
Botón tipo Toggle
SWIFTstruct ToggleButton: View { @State private var isOn = false var body: some View { Button(action: { isOn.toggle() }) { Text(isOn ? "Activo" : "Inactivo") .foregroundColor(.white) .padding() .background(isOn ? Color.green : Color.gray) .cornerRadius(10) } } }

Botón con estado de carga (Loading)
SWIFTstruct LoadingButton: View { @State private var isLoading = false var body: some View { Button(action: { isLoading = true DispatchQueue.main.asyncAfter(deadline: .now() + 2) { isLoading = false } }) { HStack { if isLoading { ProgressView() } Text(isLoading ? "Cargando..." : "Enviar") } .padding() .background(isLoading ? Color.gray : Color.blue) .foregroundColor(.white) .cornerRadius(10) } .disabled(isLoading) } }

4. Botones con Imágenes Personalizadas
No tienes que limitarte a los SF Symbols. Puedes usar tus propias imágenes en los botones.
SWIFTButton(action: { print("¡Botón con imagen personalizada!") }) { HStack { Image("tu_imagen") // Asegúrate de añadir la imagen a tus Assets .resizable() .frame(width: 24, height: 24) Text("Botón Personalizado") } .padding() .background(Color.secondary) .foregroundColor(.white) .cornerRadius(10) }

5. Accesibilidad en Botones
Haz que tus apps sean accesibles para todos. Puedes añadir descripciones de accesibilidad a tus botones:
SWIFTButton("Comprar") { print("Compra realizada") } .accessibilityLabel("Comprar producto") .accessibilityHint("Realiza la compra del producto seleccionado")

6. Botones Reutilizables con Componentes
Evita repetir código creando tu propio componente de botón reutilizable.
SWIFTstruct CustomButton: View { let title: String let color: Color let action: () -> Void var body: some View { Button(action: action) { Text(title) .fontWeight(.bold) .foregroundColor(.white) .padding() .frame(maxWidth: .infinity) .background(color) .cornerRadius(12) } } } // Uso: CustomButton(title: "Aceptar", color: .blue) { print("¡Aceptado!") }

Ejercicio Práctico: Selector de Reacciones
Crea un grupo de botones que permitan al usuario seleccionar una reacción (👍, ❤️, 😂, 😮). El botón seleccionado debe resaltarse.
SWIFTstruct ReactionSelector: View { @State private var selected: String? = nil let reactions = ["👍", "❤️", "😂", "😮"] var body: some View { HStack(spacing: 20) { ForEach(reactions, id: \.self) { reaction in Button(action: { selected = reaction }) { Text(reaction) .font(.largeTitle) .padding() .background(selected == reaction ? Color.yellow : Color.gray.opacity(0.2)) .clipShape(Circle()) } } } } }

Conclusión
¡Ahora tienes un arsenal de técnicas intermedias para crear botones más potentes y atractivos en SwiftUI! Recuerda experimentar y combinar estas ideas para crear experiencias únicas en tus apps.
¿Qué sigue?
En la próxima entrega, exploraremos técnicas avanzadas como:
- Botones animados complejos
- Integración con gestos personalizados
- Botones contextuales y menús
- Botones flotantes (FAB)
- Acciones asincrónicas y feedback háptico
¿Tienes alguna idea o pregunta? ¡Déjala en los comentarios y la incluiremos en futuros tutoriales!
Ejercicios para practicar
- Crea un botón que muestre una animación de confeti al pulsarlo.
- Haz un botón que cambie de icono y color cada vez que lo pulses.
- Implementa un grupo de botones donde solo uno pueda estar activo a la vez (como un selector de opciones).
- Añade accesibilidad a todos los botones de tu app.
¡Nos vemos en el próximo tutorial y sigue creando apps increíbles con SwiftUI!
