From b6232a9f1e3513d252df71721bb68e527a66292a Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Thu, 22 Feb 2024 23:32:38 -0500 Subject: [PATCH] Use tab bar on visionOS --- Tusker/Scenes/MainSceneDelegate.swift | 6 ++--- .../Main/MainTabBarViewController.swift | 23 +++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Tusker/Scenes/MainSceneDelegate.swift b/Tusker/Scenes/MainSceneDelegate.swift index 5976c7eb..63dcd999 100644 --- a/Tusker/Scenes/MainSceneDelegate.swift +++ b/Tusker/Scenes/MainSceneDelegate.swift @@ -253,10 +253,10 @@ class MainSceneDelegate: UIResponder, UIWindowSceneDelegate, TuskerSceneDelegate let mastodonController = window!.windowScene!.session.mastodonController! mastodonController.initialize() - let split = MainSplitViewController(mastodonController: mastodonController) - #if !canImport(Duckable) - return split + #if os(visionOS) + return MainTabBarViewController(mastodonController: mastodonController) #else + let split = MainSplitViewController(mastodonController: mastodonController) if UIDevice.current.userInterfaceIdiom == .phone, #available(iOS 16.0, *) { // TODO: maybe the duckable container should be outside the account switching container diff --git a/Tusker/Screens/Main/MainTabBarViewController.swift b/Tusker/Screens/Main/MainTabBarViewController.swift index ba8d26d8..f7c1c6fc 100644 --- a/Tusker/Screens/Main/MainTabBarViewController.swift +++ b/Tusker/Screens/Main/MainTabBarViewController.swift @@ -15,9 +15,11 @@ class MainTabBarViewController: UITabBarController, UITabBarControllerDelegate { private var composePlaceholder: UIViewController! + #if !os(visionOS) private var fastAccountSwitcher: FastAccountSwitcherViewController! private var fastSwitcherIndicator: FastAccountSwitcherIndicatorView! private var fastSwitcherConstraints: [NSLayoutConstraint] = [] + #endif var selectedTab: Tab { return Tab(rawValue: selectedIndex)! @@ -60,6 +62,7 @@ class MainTabBarViewController: UITabBarController, UITabBarControllerDelegate { embedInNavigationController(Tab.myProfile.createViewController(mastodonController)), ] + #if !os(visionOS) fastAccountSwitcher = FastAccountSwitcherViewController() fastAccountSwitcher.delegate = self fastAccountSwitcher.view.translatesAutoresizingMaskIntoConstraints = false @@ -74,16 +77,13 @@ class MainTabBarViewController: UITabBarController, UITabBarControllerDelegate { fastSwitcherIndicator.translatesAutoresizingMaskIntoConstraints = false view.addSubview(fastSwitcherIndicator) } + #endif tabBar.isSpringLoaded = true - - #if os(visionOS) - registerForTraitChanges([UITraitHorizontalSizeClass.self]) { (self: Self, previousTraitCollection) in - self.repositionFastSwitcherIndicator() - } - #endif } + // Fast account switcher is not supported on visionOS + #if !os(visionOS) override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() @@ -93,7 +93,6 @@ class MainTabBarViewController: UITabBarController, UITabBarControllerDelegate { repositionFastSwitcherIndicator() } - #if !os(visionOS) override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) @@ -126,6 +125,7 @@ class MainTabBarViewController: UITabBarController, UITabBarControllerDelegate { } } + #if !os(visionOS) private func repositionFastSwitcherIndicator() { guard let myProfileButton = findMyProfileTabBarButton() else { return @@ -146,6 +146,7 @@ class MainTabBarViewController: UITabBarController, UITabBarControllerDelegate { } NSLayoutConstraint.activate(fastSwitcherConstraints) } + #endif private func findMyProfileTabBarButton() -> UIView? { let tabBarButtons = tabBar.subviews.filter { String(describing: type(of: $0)).lowercased().contains("button") } @@ -157,9 +158,11 @@ class MainTabBarViewController: UITabBarController, UITabBarControllerDelegate { return myProfileButton } + #if !os(visionOS) @objc private func tabBarTapped(_ recognizer: UITapGestureRecognizer) { fastAccountSwitcher.hide() } + #endif @objc func handleComposeKeyCommand() { compose(editing: nil) @@ -235,6 +238,7 @@ extension MainTabBarViewController { } } +#if !os(visionOS) extension MainTabBarViewController: FastAccountSwitcherViewControllerDelegate { func fastAccountSwitcherAddToViewHierarchy(_ fastAccountSwitcher: FastAccountSwitcherViewController) { view.addSubview(fastAccountSwitcher.view) @@ -256,6 +260,7 @@ extension MainTabBarViewController: FastAccountSwitcherViewControllerDelegate { return myProfileButton.bounds.contains(locationInButton) } } +#endif extension MainTabBarViewController: TuskerNavigationDelegate { var apiController: MastodonController! { mastodonController } @@ -357,10 +362,14 @@ extension MainTabBarViewController: BackgroundableViewController { extension MainTabBarViewController: AccountSwitchableViewController { var isFastAccountSwitcherActive: Bool { + #if os(visionOS) + return false + #else if let fastAccountSwitcher { return !fastAccountSwitcher.view.isHidden } else { return false } + #endif } }