我想创建一个表单,其中所有文本字段都需要从相同的对齐方式开始,如下图所示,它不是从相同的对齐方式开始的。名字、姓氏和电话号码所有文本字段未正确对齐在一条垂直线上。
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)
最佳答案
VStack{
HStack(){
Text("First Name").frame(width: 120, alignment: .leading)
TextField("First name", text: $name).textFieldStyle(RoundedBorderTextFieldStyle())
}
HStack(){
Text("Last Name").frame(width: 120, alignment: .leading)
TextField("Last Name", text: $name).textFieldStyle(RoundedBorderTextFieldStyle())
}
HStack{
Text("Phone number").frame(width: 120, alignment: .leading)
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)
}
}
关于ios - 使用 Swiftui 我们如何创建用户表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58057022/