home indicator interaction fix

This commit is contained in:
True Zhuanjia
2026-05-16 22:45:45 +08:00
parent 5a9bcab368
commit 1630f7987a
4 changed files with 48 additions and 11 deletions
+37 -9
View File
@@ -17,8 +17,9 @@ import ObjectiveC.runtime
}
@objc public static var mapping: [Int16:OnScreenWidgetView] = [:]
@objc public static var isRestoring: Bool = false
@objc public static var hasRestoredFromAutoDock: Bool = false
@objc public static var isRestoringFolderStates: Bool = false
@objc public static var deferSlideGestureDueToAutoDockRestore: Bool = false
@objc public static var deferScreenEdgeSysGesturesDueToOnScreenWidgets: Bool = false
@objc public static var autoDockRestoreInitByViewResize: Bool = false
@objc public static func set(widget:OnScreenWidgetView, for key:Int16) {
mapping[key] = widget
@@ -3296,9 +3297,9 @@ import ObjectiveC.runtime
@objc private func vl_autoDock_touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
OnScreenWidgetView.autoDockOriginalTouchesEndedIMP?(self, #selector(OnScreenWidgetView.touchesEnded(_:with:)), touches, event)
guard autoDockEnabled else { return }
if OnScreenWidgetView.hasRestoredFromAutoDock {
if OnScreenWidgetView.deferSlideGestureDueToAutoDockRestore {
DispatchQueue.global().asyncAfter(deadline: .now() + 0.02){
OnScreenWidgetView.hasRestoredFromAutoDock = false
OnScreenWidgetView.deferSlideGestureDueToAutoDockRestore = false
}
}
autoDockRestartCountdownIfNeeded()
@@ -3459,6 +3460,11 @@ import ObjectiveC.runtime
) {
self.frame = targetFrame
self.transform = CGAffineTransform(scaleX: 0.985, y: 0.985)
if ControllerUtil.activeGCControllers.count > 0, !GenericUtils.iOS26Available {
self.parentViewController?.setNeedsUpdateOfHomeIndicatorAutoHidden()
}
} completion: { _ in
UIView.animate(withDuration: 0.1, delay: 0, options: [.allowUserInteraction, .curveEaseOut]) {
self.autoDockApplyTemporarySize()
@@ -3480,12 +3486,14 @@ import ObjectiveC.runtime
}
private func autoDockRestoreWidget(animated: Bool) {
OnScreenWidgetView.deferScreenEdgeSysGesturesDueToOnScreenWidgets = true
self.parentViewController?.setNeedsUpdateOfHomeIndicatorAutoHidden()
guard autoDockIsDocked else {
restartAutoDockCountdown()
return
}
let restoreCenter = storedCenter
OnScreenWidgetView.hasRestoredFromAutoDock = true
OnScreenWidgetView.deferSlideGestureDueToAutoDockRestore = true
autoDockStopCountdown()
autoDockStopSettledAlphaTimer()
autoDockRestoreOriginalSize()
@@ -3515,8 +3523,9 @@ import ObjectiveC.runtime
self.restartAutoDockCountdown()
if OnScreenWidgetView.autoDockRestoreInitByViewResize {
OnScreenWidgetView.autoDockRestoreInitByViewResize = false
OnScreenWidgetView.hasRestoredFromAutoDock = false
OnScreenWidgetView.deferSlideGestureDueToAutoDockRestore = false
}
OnScreenWidgetView.deferScreenEdgeSysGesturesDueToOnScreenWidgets = false
}
)
}
@@ -3647,7 +3656,7 @@ import ObjectiveC.runtime
setCollection(hidden: folded, for: folder)
if !folded, folder.revealMode == .exclusive {
OnScreenWidgetView.unfoldedExclusiveFolderSequence = folder.sequence
if(!isRestoring) {OnScreenWidgetView.postExclusiveUnfoldedSequences.removeAll()}
if(!isRestoringFolderStates) {OnScreenWidgetView.postExclusiveUnfoldedSequences.removeAll()}
let currentRootFolder = OnScreenWidgetView.getRootFolder(of: folder) ?? folder
var offshootRootFolders:Set<OnScreenWidgetView> = Set()
folder.forEachWidget{ widget in
@@ -3709,6 +3718,25 @@ import ObjectiveC.runtime
}
return false
}
@objc static var onlyRootFolderVisible: Bool {
var visibleNonFolerCount:Int = 0
var visibleFolderCount:Int = 0
for widget in OnScreenWidgetView.mapping.values {
if widget.isHidden {continue}
if widget.isFolder {
visibleFolderCount += 1
if visibleFolderCount > 1 {return false}
continue
}
else {
visibleNonFolerCount += 1
if visibleNonFolerCount > 0 {return false}
continue
}
}
return true
}
private static func putWidget(_ widget:OnScreenWidgetView, into folder:OnScreenWidgetView){
guard !OnScreenWidgetView.getParentFolders(of: folder).contains(widget), !folder.isHidden else { return }
@@ -3744,7 +3772,7 @@ import ObjectiveC.runtime
}
@objc static func restoreFoldedStates(){
isRestoring = true
isRestoringFolderStates = true
var unfoldedExclusiveFolder: OnScreenWidgetView?
if unfoldedExclusiveFolderSequence != -1 {
unfoldedExclusiveFolder = OnScreenWidgetView.mapping[unfoldedExclusiveFolderSequence]
@@ -3767,7 +3795,7 @@ import ObjectiveC.runtime
OnScreenWidgetView.set(folded: false, for: folder)
}
isRestoring = false
isRestoringFolderStates = false
}
@objc static func getMaxSequence() -> Int16{
+8
View File
@@ -417,6 +417,14 @@ import UIKit
}
return false
}
@objc static let iOS26Available: Bool = {
if #available(iOS 26.0, tvOS 26.0, *) {
return true
} else {
return false
}
}()
@objc static let liquidGlassEnabled: Bool = {
if #available(iOS 26.0, tvOS 26.0, *) {
@@ -53,7 +53,7 @@ CGFloat startPointX;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// [super touchesEnded:touches withEvent:event];
if(_excludePencilEvent && touches.anyObject.type != UITouchTypeDirect) return;
if(OnScreenWidgetView.hasRestoredFromAutoDock) return;
if(OnScreenWidgetView.deferSlideGestureDueToAutoDockRestore) return;
if([touches containsObject:capturedUITouch]){
CGFloat _endPointX = [capturedUITouch locationInView:self.view].x;
CGFloat screenWidthInPoints = self.view.frame.size.width;
@@ -2029,7 +2029,8 @@
}
- (BOOL)prefersHomeIndicatorAutoHidden {
if ( [_controllerSupport getConnectedGamepadCount] > 0 && [_streamView getCurrentOscState] == OnScreenControlsLevelOff &&
if(OnScreenWidgetView.deferScreenEdgeSysGesturesDueToOnScreenWidgets) return NO;
if ( [_controllerSupport getConnectedGamepadCount] > 0 &&
_userIsInteracting == NO) {
// Autohide the home bar when a gamepad is connected
// and the on-screen controls are disabled. We can't