Je veux créer un formulaire dans lequel tous les champs de texte doivent commencer à partir du même alignement, comme dans l'image ci-dessous, il ne part pas du même alignement. Prénom, nom et numéro de téléphone, tous les textFields ne sont pas correctement alignés sur une seule ligne verticale.
VStack(){
HStack(){
Text("First Name")
TextField("First name", text: $name).textFieldStyle(RoundedBorderTextFieldStyle())
}
HStack(){
Text("Last Name")
TextField("Last Name", text: $name).textFieldStyle(RoundedBorderTextFieldStyle())
}
HStack(){
Text("Phone number")
TextField("Phone number", text: $name).textFieldStyle(RoundedBorderTextFieldStyle())
}
Spacer()
}.padding(10)
3 Réponses :
Vous pouvez utiliser GeometryReader pour accéder à la taille de l'appareil et au frame pour définir une largeur fixe pour les Text s. Par exemple:
GeometryReader { geometry in
VStack(spacing: 10) {
HStack {
Text("First Name").frame(width: geometry.size.width / 3)
TextField("First name", text: self.$name).textFieldStyle(RoundedBorderTextFieldStyle())
}
HStack {
Text("Last Name").frame(width: geometry.size.width / 3)
TextField("Last Name", text: self.$name).textFieldStyle(RoundedBorderTextFieldStyle())
}
HStack{
Text("Phone number").frame(width: geometry.size.width / 3)
TextField("Phone number", text: self.$name).textFieldStyle(RoundedBorderTextFieldStyle())
}
Spacer()
}.padding(10)
}
Cela alignera vos TextFields:
VStack {
HStack {
HStack {
Text("First Name")
Spacer()
}
TextField("First name", text: $name)
.textFieldStyle(RoundedBorderTextFieldStyle())
}
HStack {
HStack {
Text("Last Name")
Spacer()
}
TextField("Last Name", text: $name)
.textFieldStyle(RoundedBorderTextFieldStyle())
}
HStack {
HStack {
Text("Phone number")
Spacer()
}
TextField("Phone number", text: $name)
.textFieldStyle(RoundedBorderTextFieldStyle())
}
Spacer()
} .padding(10)
struct TestView: View {
@State var name = ""
@State var width: CGFloat = 0
struct Label: ViewModifier {
@Binding var width: CGFloat
func getWidth(content: Content, proxy: GeometryProxy) -> some View {
if proxy.size.width > width {
RunLoop.main.perform {
self.width = proxy.size.width
}
}
return content
}
func body(content: Content) -> some View {
content.overlay(GeometryReader { proxy in
self.getWidth(content: content, proxy: proxy)
}).frame(minWidth: self.width, alignment: .leading)
}
}
var body: some View {
VStack(alignment: .center){
HStack(){
Text("First Name").modifier(Label(width: $width))
TextField("First name", text: $name).textFieldStyle(RoundedBorderTextFieldStyle())
}
HStack(){
Text("Last Name").modifier(Label(width: $width))
TextField("Last Name", text: $name).textFieldStyle(RoundedBorderTextFieldStyle())
}
HStack{
Text("Phone numbe").modifier(Label(width: $width))
TextField("Phone number", text: $name).textFieldStyle(RoundedBorderTextFieldStyle())
}
Spacer()
}.padding(10)
}
}
J'ai ajouté la solution flexible lorsque la largeur de tout le Texte est égale à la largeur du Texte le plus large.