DEV Community

GoyesDev
GoyesDev

Posted on

SwiftUI #26: Button

Button es un control que inicia una acción cuando se presiona.

struct ContentView: View {
  @State private var active = false

  var body: some View {
    VStack {
      Text(active ? "Hola" : "Adiós")
      Button("Conmutar") {
        active.toggle()
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Modificadores

Algunos modificadores útiles del botón

struct ContentView: View {
  var body: some View {
    VStack(spacing: 15) {
      Button("Cancelar") {
        print("Cancelando")
      }.buttonStyle(.bordered)

      Button("Enviar") {
        print("Enviando")
      }.buttonStyle(.borderedProminent)
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Los botones prominentes solo deberían ser usados para acciones primarias, indicando que una tarea importante va a ocurrir.

Rol de un botón

Cambiar el rol de un botón provoca un cambio en su estilo.

struct ContentView: View {
  var body: some View {
    VStack(spacing: 15) {
      Button("Cancelar", role: .destructive) {
        print("Cancelando")
      }.buttonStyle(.bordered)

      Button("Enviar", role: .destructive) {
        print("Enviando")
      }.buttonStyle(.borderedProminent)
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Estilo de botón personalizado

Se puede crear un estilo personalizado conformando el protocolo ButtonStyle., cuyo único requerimiento es definir el método makeBody(configuration:), que recibe un ButtonStyle.Configuration, con las siguientes propiedades:

  • isPressed: Booleano que indica si el botón está presionado
  • label: Una vista que describe visualmente al botón.
struct ExpandingButtonStyle: ButtonStyle {
  func makeBody(configuration: Configuration) -> some View {
    configuration.label
      .padding()
      .border(.red, width: 5)
      .scaleEffect(configuration.isPressed ? 1.5 : 1.0)
  }
}

struct ContentView: View {
  var body: some View {
    VStack(spacing: 15) {
      Button("Enviar", role: .confirm) {
        print("Enviando")
      }.buttonStyle(ExpandingButtonStyle())
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)