History
Loading...
Loading...
September 17, 2025
scrollDismissesKeyboard(.interactively) on ScrollView to dismiss the keyboard naturally as users scroll through content. This creates an intuitive interaction pattern that feels native and responsive.This approach combines interactive scroll dismissal with programmatic focus control and toolbar actions. The `scrollDismissesKeyboard(.interactively)` modifier allows natural keyboard dismissal during scrolling, while `@FocusState` enables precise control over which field is active. The toolbar button provides an explicit dismissal option.
struct SmartKeyboardForm: View {
@State private var email = ""
@State private var message = ""
@FocusState private var isInputActive: Bool
var body: some View {
NavigationView {
ScrollView {
VStack(spacing: 20) {
TextField("Email", text: $email)
.textFieldStyle(.roundedBorder)
.focused($isInputActive)
TextEditor(text: $message)
.frame(minHeight: 120)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(Color.secondary, lineWidth: 1)
)
.focused($isInputActive)
}
.padding()
}
.scrollDismissesKeyboard(.interactively)
.navigationTitle("Contact")
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()
Button("Done") {
isInputActive = false
}
}
}
}
}
}Users expect keyboards to behave intuitively - dismissing when they scroll away or explicitly tap 'Done'. This multi-layered approach covers different user interaction patterns while maintaining accessibility. Interactive dismissal feels natural, programmatic control handles edge cases, and the toolbar button ensures users always have a clear exit path, especially important for longer forms or TextEditor components.