From 07f8d8e89eaef53a25f14cd658221cbb03d4b5f1 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 14 Jan 2023 13:24:29 -0500 Subject: [PATCH] Fix status bar not hiding --- Reader/Info.plist | 2 ++ Reader/Screens/AppNavigationController.swift | 15 ++++++++- Reader/Screens/AppSplitViewController.swift | 8 +++++ Reader/Screens/Read/ReadViewController.swift | 32 +++++++++++++++----- 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/Reader/Info.plist b/Reader/Info.plist index 12ef63b..fbb8896 100644 --- a/Reader/Info.plist +++ b/Reader/Info.plist @@ -2,6 +2,8 @@ + UIViewControllerBasedStatusBarAppearance + NSUserActivityTypes $(PRODUCT_BUNDLE_IDENTIFIER).activity.activate-account diff --git a/Reader/Screens/AppNavigationController.swift b/Reader/Screens/AppNavigationController.swift index da509f8..d831a10 100644 --- a/Reader/Screens/AppNavigationController.swift +++ b/Reader/Screens/AppNavigationController.swift @@ -12,6 +12,14 @@ class AppNavigationController: UINavigationController, UINavigationControllerDel private var statusBarBlockingView: UIView! static let panRecognizerName = "AppNavPanRecognizer" + + override var childForStatusBarHidden: UIViewController? { + topViewController + } + + override var childForStatusBarStyle: UIViewController? { + topViewController + } override func viewDidLoad() { super.viewDidLoad() @@ -44,7 +52,12 @@ class AppNavigationController: UINavigationController, UINavigationControllerDel } func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { - statusBarBlockingView.isHidden = viewController.prefersStatusBarHidden + statusBarBlockingView.layer.opacity = viewController.prefersStatusBarHidden ? 0 : 1 + } + + override func setNeedsStatusBarAppearanceUpdate() { + super.setNeedsStatusBarAppearanceUpdate() + statusBarBlockingView?.layer.opacity = childForStatusBarHidden!.prefersStatusBarHidden ? 0 : 1 } private var poppingViewController: UIViewController? diff --git a/Reader/Screens/AppSplitViewController.swift b/Reader/Screens/AppSplitViewController.swift index 887257e..92f90c4 100644 --- a/Reader/Screens/AppSplitViewController.swift +++ b/Reader/Screens/AppSplitViewController.swift @@ -17,6 +17,14 @@ class AppSplitViewController: UISplitViewController { private var secondaryNav: UINavigationController! + override var childForStatusBarHidden: UIViewController? { + if traitCollection.horizontalSizeClass == .compact { + return viewController(for: .compact) + } else { + return nil + } + } + init(fervorController: FervorController) { self.fervorController = fervorController diff --git a/Reader/Screens/Read/ReadViewController.swift b/Reader/Screens/Read/ReadViewController.swift index 8157434..b54126d 100644 --- a/Reader/Screens/Read/ReadViewController.swift +++ b/Reader/Screens/Read/ReadViewController.swift @@ -30,12 +30,14 @@ class ReadViewController: UIViewController { private var webView: WKWebView! - #if targetEnvironment(macCatalyst) - private var itemReadObservation: NSKeyValueObservation? - #endif - override var prefersStatusBarHidden: Bool { - navigationController?.isNavigationBarHidden ?? false + if navigationController?.isNavigationBarHidden == true, + let webView, + webView.scrollView.contentOffset.y > -webView.scrollView.safeAreaInsets.top { + return true + } else { + return false + } } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { @@ -98,6 +100,18 @@ class ReadViewController: UIViewController { activityItemsConfiguration = UIActivityItemsConfiguration(objects: [url as NSURL]) } + webView.scrollView.publisher(for: \.contentOffset) + .map { [unowned self] _ in + self.prefersStatusBarHidden + } + .removeDuplicates() + .sink { [unowned self] _ in + UIView.animate(withDuration: 0.2, delay: 0) { + self.setNeedsStatusBarAppearanceUpdate() + } + } + .store(in: &cancellables) + scrollPositionChangedSubject .debounce(for: .milliseconds(500), scheduler: RunLoop.main) .sink { [unowned self] in @@ -106,9 +120,11 @@ class ReadViewController: UIViewController { .store(in: &cancellables) #if targetEnvironment(macCatalyst) - itemReadObservation = item.observe(\.read) { [unowned self] _, _ in - self.updateToggleReadToolbarImage() - } + item.publisher(for: \.read) + .sink { [unowned self] _ in + self.updateToggleReadToolbarImage() + } + .store(in: &cancellables) #endif }