// // Swiftfin is subject to the terms of the Mozilla Public // License, v2.0. If a copy of the MPL was not distributed with this // file, you can obtain one at https://mozilla.org/MPL/2.0/. // // Copyright (c) 2025 Jellyfin & Jellyfin Contributors // import SwiftUI extension UIHostingController { public convenience 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 .zero } class_addMethod( viewSubclass, #selector(getter: UIView.safeAreaInsets), imp_implementationWithBlock(safeAreaInsets), method_getTypeEncoding(method) ) } objc_registerClassPair(viewSubclass) object_setClass(view, viewSubclass) } } }