Formation PUB900 : Développer une application pour iPhone avec SwiftUI, H-2024 Les formulaires SwiftUI

67.1 Form


La structure Form permet de modifier l'apparence d'un formulaire.

Il s'agit d'un conteneur spécialisé, basé sur List, qui applique automatiquement au formulaire un style prédéfini.

Il est cependant tout à fait possible de définir un formulaire sans Form.

Dans cette fiche :

Form simple

SwiftUI

Form {
  TextField("Nom", text: $nom)
}

TextField dans Form

Ajuster l'espacement à l'intérieur du Form

Le modifieur .contentMargins() permet d'ajuster la marge entre le contenu du Form et ses bordures.

Dans cet exemple, le Form est placé dans un NavigationStack avec titre. Par défaut, l’espacement sous le titre est minimal.

Form avec titre

Avec le .contentMargins(), on a un plus grand contrôle sur l'espacement.

SwiftUI

NavigationStack {
  Form {
    TextField("Nom", text: $nom)
  }
  .contentMargins(.top, 20)
  .navigationTitle("Mon application")
}

ContentMargins

Limiter la hauteur du Form

Par défaut, un Form s'étend pour occuper tout l'espace disponible à l'écran.

Il est généralement recommandé de conserver ce comportement.

Si vous devez absolument limiter sa hauteur, le modifieur .frame() permet d'ajuster la taille du Form.

SwiftUI

Form {
  TextField("Nom", text: $nom)
}
.frame(maxHeight: 150)

Le Form sera alors centré verticalement dans l’espace disponible. Au besoin, il est possible d’utiliser un VStack et un Spacer() pour le maintenir en haut de l’écran.

Attention : en limitant la taille avec .frame(), le formulaire se transformera en zone de défilement si son contenu est plus grand que l'espace alloué. Ce comportement peut être déroutant pour l'usager.

Placer plus d'un bouton dans une ligne du formulaire

Puisque Form est basé sur List, il faut prendre une précaution particulière pour placer plus d'un bouton sur une même ligne du formulaire.

Le problème, c'est que par défaut, dans une liste, SwiftUI étire la zone cliquable des boutons sur toute la largeur de l'écran. Un seul bouton par ligne est donc cliquable.

Ce comportement est pratique : il permet de cliquer n'importe où sur la ligne pour réaliser l'action du bouton.

Dans cet exemple, SwiftUI ne parvient pas à distinguer les zones de clic, ce qui rend le comportement imprévisible.

SwiftUI

Form {
  HStack(spacing: 12) {
    Button("Premier choix") {
      choix = 1
    }
    .tint(choix == 1 ? .blue : .gray)

    Button("Deuxième choix") {
      choix = 2
    }
    .tint(choix == 2 ? .blue : .gray)
  }
}

Il s'agit d'un problème connu dont la solution est facile à mettre en place, à condition de la connaître ;-)

Il suffit de limiter la taille des boutons à l'aide d'un style prédéfini afin de permettre les clics sur chacun des boutons de la ligne.

SwiftUI

Form {
  HStack(spacing: 12) {
    Button("Premier choix") {
      choix = 1
    }
    .buttonStyle(.borderless)
    .tint(choix == 1 ? .blue : .gray)

    Button("Deuxième choix") {
      choix = 2
    }
    .buttonStyle(.borderless)
    .tint(choix == 2 ? .blue : .gray)
  }
}

Pour plus d'information

« Creating Forms in SwiftUI ». SerialCoder.dev. https://serialcoder.dev/text-tutorials/swiftui/creating-forms-in-swiftui/

 

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre