diff --git a/Gemini-iOS/BrowserNavigationController.swift b/Gemini-iOS/BrowserNavigationController.swift index 00447b2..7cba44e 100644 --- a/Gemini-iOS/BrowserNavigationController.swift +++ b/Gemini-iOS/BrowserNavigationController.swift @@ -111,6 +111,17 @@ class BrowserNavigationController: UIViewController { .store(in: &cancellables) view.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(panGestureRecognized))) + + Preferences.shared.$hideToolbarsWhenScrolling + .sink { [unowned self] (hideToolbarsWhenScrolling) in + if !hideToolbarsWhenScrolling { + // animate just in case the preference change came from another window and we're currently visible + UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseInOut) { + self.toolbarOffset = 0 + } + } + } + .store(in: &cancellables) } override func viewDidLayoutSubviews() { @@ -341,6 +352,7 @@ extension BrowserNavigationController { extension BrowserNavigationController: UIScrollViewDelegate { func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + guard Preferences.shared.hideToolbarsWhenScrolling else { return } trackingScroll = true prevScrollViewContentOffset = scrollView.contentOffset scrollStartedBelowEnd = scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.bounds.height + scrollView.safeAreaInsets.bottom) diff --git a/Gemini-iOS/Preferences.swift b/Gemini-iOS/Preferences.swift index 3cec739..95ba02c 100644 --- a/Gemini-iOS/Preferences.swift +++ b/Gemini-iOS/Preferences.swift @@ -45,6 +45,10 @@ class Preferences: Codable, ObservableObject { useInAppSafari = try container.decode(Bool.self, forKey: .useInAppSafari) useReaderMode = try container.decode(Bool.self, forKey: .useReaderMode) + + if let stored = try container.decodeIfPresent(Bool.self, forKey: .hideToolbarsWhenScrolling) { + hideToolbarsWhenScrolling = stored + } } func encode(to encoder: Encoder) throws { @@ -57,6 +61,8 @@ class Preferences: Codable, ObservableObject { try container.encode(useInAppSafari, forKey: .useInAppSafari) try container.encode(useReaderMode, forKey: .useReaderMode) + + try container.encode(hideToolbarsWhenScrolling, forKey: .hideToolbarsWhenScrolling) } @Published var homepage = AppDelegate.defaultHomepage @@ -67,6 +73,8 @@ class Preferences: Codable, ObservableObject { @Published var useInAppSafari = false @Published var useReaderMode = false + @Published var hideToolbarsWhenScrolling = true + enum CodingKeys: String, CodingKey { case homepage @@ -75,6 +83,8 @@ class Preferences: Codable, ObservableObject { case useInAppSafari case useReaderMode + + case hideToolbarsWhenScrolling } } diff --git a/Gemini-iOS/PreferencesView.swift b/Gemini-iOS/PreferencesView.swift index b4b1442..8de09f9 100644 --- a/Gemini-iOS/PreferencesView.swift +++ b/Gemini-iOS/PreferencesView.swift @@ -20,6 +20,8 @@ struct PreferencesView: View { appearanceSection safariSection + + behaviorSection } .navigationBarTitle("Preferences") .insetOrGroupedListStyle() @@ -69,6 +71,12 @@ struct PreferencesView: View { .disabled(!preferences.useInAppSafari) } } + + private var behaviorSection: some View { + Section(header: Text("Behavior")) { + Toggle("Hide Toolbars When Scrolling", isOn: $preferences.hideToolbarsWhenScrolling) + } + } } fileprivate extension View { diff --git a/Gemini.xcodeproj/xcuserdata/shadowfacts.xcuserdatad/xcschemes/xcschememanagement.plist b/Gemini.xcodeproj/xcuserdata/shadowfacts.xcuserdatad/xcschemes/xcschememanagement.plist index 7d5c47b..a10481c 100644 --- a/Gemini.xcodeproj/xcuserdata/shadowfacts.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Gemini.xcodeproj/xcuserdata/shadowfacts.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ BrowserCore.xcscheme_^#shared#^_ orderHint - 3 + 5 Gemini-iOS.xcscheme_^#shared#^_ @@ -27,17 +27,17 @@ GeminiIntents.xcscheme_^#shared#^_ orderHint - 6 + 3 GeminiProtocol.xcscheme_^#shared#^_ orderHint - 4 + 6 GeminiRenderer.xcscheme_^#shared#^_ orderHint - 5 + 4 SuppressBuildableAutocreation