2023 App Services
WWDC23 · 16 min · App Services
Keep up with the keyboard
Each year, the keyboard evolves to support an increasing range of languages, sizes, and features. Discover how you can design your app to keep up with the keyboard, regardless of how it appears on a device. We’ll show you how to create frictionless text entry and share important architectural changes to help you understand how the keyboard works within the system.
Watch at developer.apple.com ↗Chapters
Code shown on screen · 5 snippets
Keyboard layout guide
view.keyboardLayoutGuide.topAnchor.constraint(equalTo: textView.bottomAnchor).isActive = true usesBottomSafeArea
// Example of using usesBottomSafeArea to create keyboard and text view aligned with safe area
view.keyboardLayoutGuide.usesBottomSafeArea = false
textField.topAnchor.constraint(equalToSystemSpacingBelow: backdrop.topAnchor, multiplier: 1.0).isActive = true
view.keyboardLayoutGuide.topAnchor.constraint(greaterThanOrEqualToSystemSpacingBelow: textField.bottomAnchor, multiplier: 1.0).isActive = true
view.keyboardLayoutGuide.topAnchor.constraint(equalTo: backdrop.bottomAnchor).isActive = true
view.safeAreaLayoutGuide.bottomAnchor.constraint(greaterThanOrEqualTo: textField.bottomAnchor).isActive = true Keyboard dismiss padding
var dismissPadding = aboveKeyboardView.bounds.size.height
view.keyboardLayoutGuide.keyboardDismissPadding = dismissPadding Handle willShow or hideKeyboard notifications
func handleWillShowOrHideKeyboardNotification(notification: NSNotification) {
// Retrieve the UIScreen object from the notification (Added iOS 16.1)
guard let screen = notification.object as? UIScreen else { return }
// Determine if the notification’s screen corresponds to your view’s screen
guard(screen.isEqual(view.window?.screen)) else { return }
// Calculate intersection with keyboard
let endFrameKey = UIResponder.keyboardFrameEndUserInfoKey
// Get the ending screen position of the keyboard
guard let keyboardFrameEnd = userInfo[endFrameKey] as? CGRect else { return }
let fromCoordinateSpace: UICoordinateSpace = screen.coordinateSpace
let toCoordinateSpace: UICoordinateSpace = view
// Convert from the screen coordinate space to your local coordinate space
let convertedKeyboardFrameEnd = fromCoordinateSpace.convert(keyboardFrameEnd, to: toCoordinateSpace)
// Calculate offset for view adjustment
var bottomOffset = view.safeAreaInsets.bottom
// Get the intersection between the keyboard's frame and the view's bounds
let viewIntersection = view.bounds.intersection(convertedKeyboardFrameEnd)
// Check whether the keyboard intersects your view before adjusting your offset.
if !viewIntersection.isEmpty {
// Set the offset to the height of the intersection
bottomOffset = viewIntersection.size.height
}
// Use the new offset to adjust your UI
movingBottomConstraint.constant = bottomOffset
// Adjust view layouts and animate using information in notification
...
} Inline predictions
public protocol UITextInputTraits : NSObjectProtocol {
// Controls whether inline text prediction is enabled or disabled during typing
@available(iOS, introduced: 17.0)
optional var inlinePredictionType: UITextInlinePredictionType { get set }
}
public enum UITextInlinePredictionType : Int, @unchecked Sendable {
case `default` = 0
case no = 1
case yes = 2
}
let textView = UITextView(frame: frame)
textView.inlinePredictionType = .yes Resources
Related sessions
-
16 min -
15 min