From 0a88ed672bb3cb099c85c8268abc47390358a767 Mon Sep 17 00:00:00 2001 From: Duy Tran Khanh Date: Thu, 17 Nov 2022 11:07:05 +0700 Subject: [PATCH] Tweak SplitViewController for vertical iPhone In vertical orientation, the primary view controller is set to overlay mode. --- Natives/Info.plist | 1 + Natives/LauncherSplitViewController.m | 46 +++++++++++++++++++-------- Natives/UIKit+hook.m | 4 +++ Natives/utils.h | 2 +- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/Natives/Info.plist b/Natives/Info.plist index bca09c08..2829f96a 100644 --- a/Natives/Info.plist +++ b/Natives/Info.plist @@ -135,6 +135,7 @@ UISupportedInterfaceOrientations + UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight diff --git a/Natives/LauncherSplitViewController.m b/Natives/LauncherSplitViewController.m index efcbb765..c293781e 100644 --- a/Natives/LauncherSplitViewController.m +++ b/Natives/LauncherSplitViewController.m @@ -3,9 +3,8 @@ #import "LauncherNavigationController.h" #import "utils.h" -@interface LauncherSplitViewController () { +@interface LauncherSplitViewController (){ } - @end @implementation LauncherSplitViewController @@ -14,26 +13,47 @@ [super viewDidLoad]; UIApplication.sharedApplication.idleTimerDisabled = YES; setViewBackgroundColor(self.view); - - //TODO: maximumPrimaryColumnWidth + self.delegate = self; LauncherMenuViewController *masterVc = [[LauncherMenuViewController alloc] init]; LauncherNavigationController *detailVc = [[LauncherNavigationController alloc] init]; detailVc.toolbarHidden = NO; - self.presentsWithGesture = YES; - self.preferredDisplayMode = UISplitViewControllerDisplayModeOneBesideSecondary; - self.viewControllers = @[[[UINavigationController alloc] initWithRootViewController:masterVc], detailVc]; + BOOL isPortrait = self.view.frame.size.height > self.view.frame.size.width; + self.preferredDisplayMode = isPortrait ? + UISplitViewControllerDisplayModeOneOverSecondary : + UISplitViewControllerDisplayModeOneBesideSecondary; if (@available(iOS 14.0, tvOS 14.0, *)) { - self.preferredSplitBehavior = UISplitViewControllerSplitBehaviorTile; + self.preferredSplitBehavior = isPortrait ? + UISplitViewControllerSplitBehaviorOverlay : + UISplitViewControllerSplitBehaviorTile; + } + + self.presentsWithGesture = YES; + + self.viewControllers = @[[[UINavigationController alloc] initWithRootViewController:masterVc], detailVc]; +} + +- (void)splitViewController:(UISplitViewController *)svc willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode { + if (self.preferredDisplayMode != displayMode) { + dispatch_async(dispatch_get_main_queue(), ^{ + self.preferredDisplayMode = UISplitViewControllerDisplayModeSecondaryOnly; + }); } } -- (UITraitCollection *)traitCollection { - // Allows splitting on compact-sized iPhones - UITraitCollection *collection = super.traitCollection; - UITraitCollection *horizontalCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular]; - return [UITraitCollection traitCollectionWithTraitsFromCollections:@[collection, horizontalCollection]]; +- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator +{ + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; + + self.preferredDisplayMode = size.height > size.width ? + UISplitViewControllerDisplayModeOneOverSecondary : + UISplitViewControllerDisplayModeOneBesideSecondary; + if (@available(iOS 14.0, tvOS 14.0, *)) { + self.preferredSplitBehavior = size.height > size.width ? + UISplitViewControllerSplitBehaviorOverlay : + UISplitViewControllerSplitBehaviorTile; + } } - (void)dismissViewController { diff --git a/Natives/UIKit+hook.m b/Natives/UIKit+hook.m index 7780419c..3d535170 100644 --- a/Natives/UIKit+hook.m +++ b/Natives/UIKit+hook.m @@ -39,6 +39,10 @@ __attribute__((constructor)) void hookConstructor(void) { @implementation UITraitCollection(hook) +- (UIUserInterfaceSizeClass)horizontalSizeClass { + return UIUserInterfaceSizeClassRegular; +} + - (UIUserInterfaceSizeClass)verticalSizeClass { return UIUserInterfaceSizeClassRegular; } diff --git a/Natives/utils.h b/Natives/utils.h index b71e57f4..1baaee9a 100644 --- a/Natives/utils.h +++ b/Natives/utils.h @@ -70,7 +70,7 @@ void* gbuffer; // OSMesa framebuffer long showingWindow; int windowWidth, windowHeight; int physicalWidth, physicalHeight; -bool isInputReady, isCursorEntered, isPrepareGrabPos, isUseStackQueueCall; +BOOL isInputReady, isCursorEntered, isPrepareGrabPos, isUseStackQueueCall; jboolean isGrabbing; BOOL virtualMouseEnabled;