-
-
Save steipete/da72299613dcc91e8d729e48b4bb582c to your computer and use it in GitHub Desktop.
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) | |
} | |
} | |
} |
Thank you! Also, as @vBoykoGit mentioned, don't forget to add ignoreSafeArea: true
!
Yes, awesome, thank you! But is this safe to ship to the App Store or might the app get rejected?
Thank you! @sfunke I've gotten multiple app versions approved with this snippet in the codebase, so it shouldn't be a problem.
Thank you, this is awesome 🔥
The fact this is still useful after 5 months is terrible. The fact this is working is wonderful :)
Thanks Peter 🙏
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
Man, you just saved my day. Thank you!