48 lines
1.6 KiB
Swift
48 lines
1.6 KiB
Swift
//
|
|
// 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)
|
|
}
|
|
}
|
|
}
|