Last active
November 23, 2024 15:13
-
-
Save steipete/da72299613dcc91e8d729e48b4bb582c to your computer and use it in GitHub Desktop.
Disable Keyboard Interaction with UIHostingController. https://steipete.com/posts/disabling-keyboard-avoidance-in-swiftui-uihostingcontroller/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension UIHostingController { | |
convenience public init(rootView: Content, ignoreSafeArea: Bool) { | |
self.init(rootView: rootView) | |
if ignoreSafeArea { | |
disableSafeArea() | |
} | |
} | |
func disableSafeArea() { | |
guard let viewClass = object_getClass(view) else { return } | |
let viewSubclassName = String(cString: class_getName(viewClass)).appending("_IgnoreSafeArea") | |
if let viewSubclass = NSClassFromString(viewSubclassName) { | |
object_setClass(view, viewSubclass) | |
} | |
else { | |
guard let viewClassNameUtf8 = (viewSubclassName as NSString).utf8String else { return } | |
guard let viewSubclass = objc_allocateClassPair(viewClass, viewClassNameUtf8, 0) else { return } | |
if let method = class_getInstanceMethod(UIView.self, #selector(getter: UIView.safeAreaInsets)) { | |
let safeAreaInsets: @convention(block) (AnyObject) -> UIEdgeInsets = { _ in | |
return .zero | |
} | |
class_addMethod(viewSubclass, #selector(getter: UIView.safeAreaInsets), imp_implementationWithBlock(safeAreaInsets), method_getTypeEncoding(method)) | |
} | |
if let method2 = class_getInstanceMethod(viewClass, NSSelectorFromString("keyboardWillShowWithNotification:")) { | |
let keyboardWillShow: @convention(block) (AnyObject, AnyObject) -> Void = { _, _ in } | |
class_addMethod(viewSubclass, NSSelectorFromString("keyboardWillShowWithNotification:"), imp_implementationWithBlock(keyboardWillShow), method_getTypeEncoding(method2)) | |
} | |
objc_registerClassPair(viewSubclass) | |
object_setClass(view, viewSubclass) | |
} | |
} | |
} |
i owe you a cookie ❤️
good job
does this also works for keyboard avoidance that a textFiled in a swiftUI sheet?
Waiting your response and really appreciate it!
I just learned that since iOS 16.4 this is no longer needed. You can now use self.safeAreaRegions.remove(.keyboard)
: https://developer.apple.com/documentation/swiftui/uihostingcontroller/safearearegions
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The fact this is still useful after 5 months is terrible. The fact this is working is wonderful :)
Thanks Peter 🙏