Я создаю экран SignUp, используя структуру SwiftUI.
У меня есть два текстовых поля, FirstName и LastName, и одна кнопка.
Я группирую их в 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"))
}
}
}
Похоже, что установка shadow после эффектов цвета/непрозрачности вызывает проблемы в этом конкретном сценарии.
Чтобы убедиться, что эффекты композитинга отрисовывают до тень, вы можете добавить .compositingGroup() к VStack прямо перед shadow, и это решит проблему.
Документация говорит:
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"))
Пользовательский интерфейс может быть дополнительно упрощен таким образом — достигается тот же результат.
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"))
}
}
}
Я считаю, что это должен быть принятый ответ, потому что он позволяет оригинальному плакату по-прежнему достигать желаемого пользовательского интерфейса.