【问题标题】:SwiftUI textfield height didn't changeSwiftUI 文本字段高度没有改变
【发布时间】:2020-02-24 11:09:41
【问题描述】:

我有一个简单的 TextField 并设置了高度和其他一些属性,但问题是文本字段的高度没有改变,下面是我的代码

 struct LoginView: View {

    @State private var email = ""
    @State private var password = ""

    var body: some View {
        VStack() {
            TextField("Email", text: self.$email)
                .frame(height: 55)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .cornerRadius(16)
                .padding([.leading, .trailing], 24)

            SecureField("Password", text: self.$password)
                .frame(height: 55)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .cornerRadius(16)
                .padding([.leading, .trailing], 24)
        }
    }
}
struct LoginView_Previews: PreviewProvider {
    static var previews: some View {
        LoginView()
    }
}

但是这不起作用。

【问题讨论】:

    标签: swiftui textfield


    【解决方案1】:

    让我们检查一下!

    import SwiftUI
    
    struct ContentView: View {
    
        @State private var email = ""
        @State private var password = ""
    
        var body: some View {
            VStack() {
                TextField("Email", text: self.$email)
                    .frame(height: 200).border(Color.red)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .cornerRadius(16)
                    .padding([.leading, .trailing], 24)
    
                SecureField("Password", text: self.$password)
                    .frame(height: 55)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .cornerRadius(16)
                    .padding([.leading, .trailing], 24)
            }
        }
    }
    
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    

    您必须了解视图修饰符的工作原理。 任何修饰符都会返回带有修改后内容的新视图

    看到这个 :-)

    import SwiftUI
    
    struct ContentView: View {
    
        @State private var email = ""
        @State private var password = ""
    
        var body: some View {
            VStack() {
                TextField("Email", text: self.$email)
                    .frame(height: 200).border(Color.red)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .cornerRadius(16)
                    .padding([.leading, .trailing], 24)
    
                SecureField("Password", text: self.$email)
                .frame(height: 55)
                .textFieldStyle(PlainTextFieldStyle())
                .padding([.leading, .trailing], 4)
                .cornerRadius(16)
                    .overlay(RoundedRectangle(cornerRadius: 16).stroke(Color.gray).padding(.bottom, -150).padding(.top, 50))
                .padding([.leading, .trailing], 24)
            }
        }
    }
    
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    

    如您所见,TextField 本身的样式从未更改,除非您明确更改它。

    目前TextFieldStyle公共API非常有限

    /// A specification for the appearance and interaction of a `TextField`.
    @available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
    public protocol TextFieldStyle {
    }
    

    您可以只选择一个预定义...

    DefaultTextFieldStyle
    PlainTextFieldStyle
    RoundedBorderTextFieldStyle
    SquareBorderTextFieldStyle
    

    你是对的!您无法更改 TextField 的高度,它的高度取决于用于呈现它的字体,除了应用一些自定义 TextFieldStyle 它没有记录,并且可能会在未来的版本中更改...

    更新,基于 How to change SwiftUI TextField style after tapping on it? (所有学分应归本问题作者所有)

    自定义 TextFieldStyle 示例

    import SwiftUI
    
    struct ContentView: View {
    
        @State private var email = ""
        @State private var password = ""
    
        var body: some View {
            VStack() {
                TextField("Email", text: self.$email)
                    .textFieldStyle(MyTextFieldStyle()).border(Color.blue)
            }
        }
    }
    
    struct MyTextFieldStyle: TextFieldStyle {
        func _body(configuration: TextField<Self._Label>) -> some View {
            configuration
            .padding(30)
            .background(
                RoundedRectangle(cornerRadius: 20, style: .continuous)
                    .stroke(Color.red, lineWidth: 3)
            ).padding()
        }
    }
    
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    

    最后的样子,这就是你要找的……

    【讨论】:

      【解决方案2】:

      改用下面的纯文本字段样式

      TextField("Email", text: self.$email)
          .frame(height: 55)
          .textFieldStyle(PlainTextFieldStyle())
          .padding([.horizontal], 4)
          .cornerRadius(16)
          .overlay(RoundedRectangle(cornerRadius: 16).stroke(Color.gray))
          .padding([.horizontal], 24)
      

      【讨论】:

      • 请看我的更新,以及自定义 TextFieldStyle 的示例(这不是我自己的想法)
      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      相关资源
      最近更新 更多