无法在 TextField 中键入

Unable to type in TextField

我正在使用 SwiftUI 框架创建一个 SignUp 屏幕。

我有两个文本框,FirstNameLastName,还有一个按钮。

我将它们分组在 VStack 中。

当我在 运行 应用程序时,按钮是可点击的,但我无法在文本字段中输入任何内容。

这是我的代码:

@State var firstName = ""
@State var lastName = ""
var body: some View {

    NavigationView {

        VStack {

            VStack {

                VStack {

                    Group {
                       TextField($firstName, placeholder: Text("First Name")).padding(10)
                    }.background(Color.white).clipShape(RoundedRectangle(cornerRadius: 5))
                        .shadow(radius: 3)

                    Group {
                        TextField($lastName, placeholder: Text("Last Name")).padding(10)
                    }.background(Color.white).clipShape(RoundedRectangle(cornerRadius: 5))
                        .shadow(radius: 3)

                    Button(action: {
                    }) {
                        Group {
                            Text("Create User").color(.white).padding(10)
                        }.background(Color.blue).clipShape(RoundedRectangle(cornerRadius: 5))
                            .shadow(radius: 5)
                    }
                }.padding(12)
                .background(Color.gray)
                .shadow(radius: 5)

            }.background(Color.gray)

        }.navigationBarTitle(Text("Sign Up"))
    }
}

在 VStack 上添加阴影创建问题。请检查下面的代码。我把影子注释掉了。

struct ContentView: View {

    @State var firstName = ""
    @State var lastName = ""
    var body: some View {

        NavigationView {

            VStack {

                VStack {

                    VStack {

                        Group {
                            TextField($firstName, placeholder: Text("First Name")).padding(10)
                            }.background(Color.black).clipShape(RoundedRectangle(cornerRadius: 5))
                            .shadow(radius: 3)

                        Group {
                            TextField($lastName, placeholder: Text("Last Name")).padding(10)
                            }.background(Color.black).clipShape(RoundedRectangle(cornerRadius: 5))
                            .shadow(radius: 3)

                        Button(action: {
                            print("Button Tapped")
                        }) {
                            Group {
                                Text("Create User").color(.white).padding(10)
                                }.background(Color.blue).clipShape(RoundedRectangle(cornerRadius: 5))
                                .shadow(radius: 5)
                        }
                        }.padding(12)
                        .background(Color.gray)
//                        .shadow(radius: 5)

                    }.background(Color.gray)

                }.navigationBarTitle(Text("Sign Up"))
        }
    }
}

似乎在 color/opacity 效果之后设置 shadow 会导致此特定场景出现问题。

为了确保合成效果在 之前 渲染阴影,您可以将 .compositingGroup() 添加到 VStack - 就在 shadow 之前 -这解决了问题。

Documentation 说:

A compositing group makes compositing effects in this view’s ancestor views, like opacity and the blend mode, take effect before this view renders.

修改后的代码:

VStack {
    // [...]  
}
.padding(12)
.background(Color.gray)
.compositingGroup() // THIS
.shadow(radius: 5)
.navigationBarTitle(Text("Sign Up"))

UI 可以通过这种方式进一步简化 - 它达到相同的结果。

struct ContentView: View {

    @State var firstName = ""
    @State var lastName = ""

    var body: some View {

        NavigationView {

            VStack {

                    TextField($firstName, placeholder: Text("First Name"))
                        .padding(10)
                        .background(Color.white)
                        .cornerRadius(5)
                        .shadow(radius: 3)

                    TextField($lastName, placeholder: Text("Last Name"))
                        .padding(10)
                        .background(Color.white)
                        .cornerRadius(5)
                        .shadow(radius: 3)

                    Button(action: { }) {
                        Text("Create User")
                            .color(.white)
                            .padding(10)
                            .background(Color.blue)
                            .cornerRadius(5)
                            .shadow(radius: 5)
                    }
            }
            .padding(12)
            .background(Color.gray)
            .compositingGroup()
            .shadow(radius: 5)
            .navigationBarTitle(Text("Sign Up"))
        }

    }

}