34 lines
1.1 KiB
Swift
34 lines
1.1 KiB
Swift
|
//
|
||
|
// Swizzler.swift
|
||
|
// Duckable
|
||
|
//
|
||
|
// Created by Shadowfacts on 11/7/22.
|
||
|
//
|
||
|
|
||
|
import UIKit
|
||
|
import os.log
|
||
|
|
||
|
private var hasInitialized = false
|
||
|
var isDetentChangingDueToGrabberAction = false
|
||
|
|
||
|
@available(iOS 16.0, *)
|
||
|
func swizzleSheetController() {
|
||
|
guard !hasInitialized else {
|
||
|
return
|
||
|
}
|
||
|
hasInitialized = true
|
||
|
|
||
|
var originalIMP: IMP?
|
||
|
let imp = imp_implementationWithBlock({ (self: UISheetPresentationController, param: AnyObject) in
|
||
|
let original = unsafeBitCast(originalIMP!, to: (@convention(c) (UISheetPresentationController, AnyObject) -> Void).self)
|
||
|
isDetentChangingDueToGrabberAction = true
|
||
|
original(self, param)
|
||
|
isDetentChangingDueToGrabberAction = false
|
||
|
} as @convention(block) (UISheetPresentationController, AnyObject) -> Void)
|
||
|
let sel = [":", "PrimaryAction", "GrabberDidTrigger", "dropShadowView", "_"].reversed().joined()
|
||
|
originalIMP = class_replaceMethod(UISheetPresentationController.self, Selector(sel), imp, "v@:@")
|
||
|
if originalIMP == nil {
|
||
|
os_log(.fault, log: .default, "Unable to initialize Duckable grabber tap hook")
|
||
|
}
|
||
|
}
|