首页 > 解决方案 > 如何使 TextField 始终位于键盘正上方?

问题描述

我想让 TextField 在单击时始终位于键盘的正上方。该代码无法按我的预期工作,并且 TextField 取决于其位置,而不是键盘的位置(仅当 TextField 位于键盘下方时才有效)

HStack(spacing: 10) {
    TextField()
}
.onAppear {
    NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { (noti) in
    let value = noti.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as! CGRect
    self.height = value.height
    self.clickedOut = false
    }
    NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { (noti) in
    self.height = 0
    self.showTextField = false
    }
}

if self.showTextField == true {
    TextField()
    .background(Color("InvertPrimaryFontColor"))
    .offset(y: (-self.height/2) - 12)
    .padding(.leading, -10)
    .animation(.spring())
}

标签: swiftswiftui

解决方案


您可以使用onEditingChangedTextField 来解决问题:

struct ContentView: View {
    
    var body: some View {
        
        TextFieldView()
        
    }
    
}


struct TextFieldView: View {
    
    @State private var email: String = String()
    @State private var textFieldIsUnderEdit: Bool = Bool()
    
    var body: some View {
        
        VStack {
            
            if textFieldIsUnderEdit { Spacer() }
            
            TextField("Enter your email address Here...", text: $email, onEditingChanged: { _ in textFieldIsUnderEdit.toggle() })
                .keyboardType(.emailAddress)
            
            Divider()
            
        }
        .padding(.horizontal)
        .animation(nil)
        
    }
    
}

在此处输入图像描述


推荐阅读