我是一名初学者编码员。我使用 SwiftUI 开发了我的第一个应用程序,但我在键盘方面遇到了一个巨大的问题(错误):触摸 TextField 时视图会向上移动。我根本不想让我的视图移动。
我有一个 ContentView(有问题的那个),其中包含自定义导航栏和几个视图。
下面的简化代码。
我的自定义视图:
struct ContentView: View {
var body: some View {
CustomNavBarContainerPreview {
ZStack {
Color(.purple)
.opacity(0.4)
.ignoresSafeArea(.all)
VStack(alignment: .center) {
//view with textfield
PullView()
RandomView()
LanguageView()
Button {
//action
} label: {
ZStack {
RoundedRectangle(cornerRadius: 15)
.foregroundColor(.cyan)
.frame(minWidth: 300, idealWidth: 340, maxWidth: 340, minHeight: 70, idealHeight: 85, maxHeight: 85, alignment: .center)
Text("Accept Settings")
.font(Font.custom("Ubuntu-Regular", size: 24))
.foregroundColor(.white)
}
.padding(.vertical, 10)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
//using this isn't prevent the view from pusing up
.ignoresSafeArea(.keyboard, edges: .bottom)
}
// it doesn't work too
.ignoresSafeArea(.keyboard)
.onTapGesture {
dismissKeyboard()
}
}
}
func dismissKeyboard() {
UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.endEditing(true)
}
}
我的孩子的观点:
struct PullView: View {
@State var num1: String = ""
@State var num2: String = ""
var body: some View {
ZStack(alignment: .topLeading) {
Rectangle()
.frame(minWidth: 342, idealWidth: 342, maxWidth: 342, minHeight: 150, idealHeight: 178, maxHeight: 178, alignment: .center)
.foregroundColor(.white)
VStack {
HStack {
Text("Title One")
.bold()
.multilineTextAlignment(.leading)
.foregroundColor(.black)
.padding(.leading, 15)
Spacer()
Image(systemName: "info.circle.fill")
.scaledToFill()
.frame(alignment: .trailing)
.padding(.trailing, 15)
}
.frame(maxWidth: 342, maxHeight: 50)
.padding(EdgeInsets.init(top: 0, leading: 0, bottom: 0, trailing: 0))
.background(Rectangle()
.foregroundColor(Color(red: 230/255, green: 234/255, blue: 242/255))
.opacity(0.5))
HStack(alignment: .center) {
Text("field1")
.foregroundColor(.black)
TextField("", value: $num1, formatter: NumberFormatter())
.textFieldStyle(DefaultTextFieldStyle())
.foregroundColor(.black)
.multilineTextAlignment(.center)
.frame(width: 90, height: 48)
.keyboardType(.numberPad)
.background(.green)
Text("field2")
.foregroundColor(.black)
TextField("", value: $num2, formatter: NumberFormatter())
.textFieldStyle(DefaultTextFieldStyle())
.foregroundColor(.black)
.multilineTextAlignment(.center)
.frame(width: 90, height: 48)
.keyboardType(.numberPad)
.background(.green)
}
.padding(.all, 10)
}
}
}
}
struct RandomView: View {
var body: some View {
ZStack(alignment: .topLeading) {
Rectangle()
.frame(minWidth: 342, idealWidth: 342, maxWidth: 342, minHeight: 150, idealHeight: 178, maxHeight: 178, alignment: .center)
.foregroundColor(.white)
VStack {
HStack {
Text("Title Two")
.bold()
.multilineTextAlignment(.leading)
.foregroundColor(.black)
.padding(.leading, 15)
Spacer()
Image(systemName: "info.circle.fill")
.scaledToFill()
.frame(alignment: .trailing)
.padding(.trailing, 15)
}
.frame(maxWidth: 342, maxHeight: 50)
.padding(EdgeInsets.init(top: 0, leading: 0, bottom: 0, trailing: 0))
.background(Rectangle()
.foregroundColor(Color(red: 230/255, green: 234/255, blue: 242/255))
.opacity(0.5))
Text("Random settings")
Text("Subview test")
}
}
}
}
struct LanguageView: View {
var body: some View {
ZStack(alignment: .topLeading) {
Rectangle()
.frame(minWidth: 342, idealWidth: 342, maxWidth: 342, minHeight: 150, idealHeight: 178, maxHeight: 178, alignment: .center)
.foregroundColor(.white)
VStack {
HStack {
Text("Title Three")
.bold()
.multilineTextAlignment(.leading)
.foregroundColor(.black)
.padding(.leading, 15)
Spacer()
Image(systemName: "info.circle.fill")
.scaledToFill()
.frame(alignment: .trailing)
.padding(.trailing, 15)
}
.frame(maxWidth: 342, maxHeight: 50)
.padding(EdgeInsets.init(top: 0, leading: 0, bottom: 0, trailing: 0))
.background(Rectangle()
.foregroundColor(Color(red: 230/255, green: 234/255, blue: 242/255))
.opacity(0.5))
Text("Language settings")
Text("Subview test")
}
}
}
}
和观点
struct CustomNavBar: View {
var body: some View {
ZStack {
Rectangle()
.foregroundColor(.clear)
.frame(width: .infinity, height: 70)
.background(.mint)
HStack {
Button("Back") {
}
Spacer()
Text("Heading")
.bold()
.foregroundColor(.white)
Spacer()
Button("Next") {
}
}
.padding(.horizontal)
}
.navigationBarHidden(true)
}
}
struct CustomNavBarContainerPreview<Content: View>: View {
let content: Content
init(@ViewBuilder content: () -> Content) {
self.content = content()
}
var body: some View {
VStack(spacing: 0) {
CustomNavBar()
content
}
}
}
我的 GitHub 测试项目在这里: 准备测试
这可能是什么问题?我该如何解决它?
我挖了StackOverflow,没有找到答案。我发现这是 SwiftUI 中的一个常见错误。 我尝试将 .ignoresSafeAres(.keyboard) 和 .ignoresSafeArea(.keyboard, Edges: .bottom) 粘贴到下面代码中的任何位置(在 ContentView、SettingsViews、自定义导航栏中),以使用 Spacers() 和 .ignoresSafeArea(.keyboard) 。 ignoresSafeArea(.all),它没有给出任何结果:视图仍在移动。 我还使用了 ScrollView 的 hack 来修复它,但它对我来说没有正确工作。
我可以嵌入 UIKit 代码来控制视图和键盘吗?但我不知道该怎么做。
预先感谢您的关注和时间!
我知道您写道添加 ScrollView 对您没有帮助。我将您的代码一一复制到一个新的 Xcode 项目中,在 ContentView 中的 VStack 周围添加了一个 ScrollView,对我来说,此后键盘不再将视图向上推。