Skip to content

Commit 7bd4d8c

Browse files
committed
Send a bool to the banner view for visibility. Extend scroll delegate with visibility logic.
1 parent f401fbe commit 7bd4d8c

7 files changed

Lines changed: 41 additions & 15 deletions

File tree

WordPress/Classes/ViewRelated/Activity/JetpackActivityLogViewController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Combine
33

44
class JetpackActivityLogViewController: BaseActivityListViewController {
55
private let jetpackBannerView = JetpackBannerView()
6-
let scrollViewTranslationPublisher = PassthroughSubject<CGFloat, Never>()
6+
let scrollViewTranslationPublisher = PassthroughSubject<Bool, Never>()
77

88
override init(site: JetpackSiteRef, store: ActivityStore, isFreeWPCom: Bool = false) {
99
let activityListConfiguration = ActivityListConfiguration(
@@ -53,6 +53,6 @@ class JetpackActivityLogViewController: BaseActivityListViewController {
5353
extension JetpackActivityLogViewController: JPScrollViewDelegate {
5454
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
5555
super.scrollViewDidScroll(scrollView)
56-
scrollViewTranslationPublisher.send(scrollView.panGestureRecognizer.translation(in: scrollView.superview).y)
56+
processJetpackBannerVisibility(scrollView)
5757
}
5858
}
Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import Combine
22
import CoreGraphics
3+
import UIKit
34

45
/// Conform to this protocol to send scrollview translations to a `JetpackBannerView` instance
56
protocol JPScrollViewDelegate: UIScrollViewDelegate {
67

7-
var scrollViewTranslationPublisher: PassthroughSubject<CGFloat, Never> { get }
8+
var scrollViewTranslationPublisher: PassthroughSubject<Bool, Never> { get }
89
func addTranslationObserver(_ receiver: JetpackBannerView)
910
}
1011

@@ -13,4 +14,30 @@ extension JPScrollViewDelegate {
1314
func addTranslationObserver(_ receiver: JetpackBannerView) {
1415
scrollViewTranslationPublisher.subscribe(receiver)
1516
}
17+
18+
func processJetpackBannerVisibility(_ scrollView: UIScrollView) {
19+
let shouldHideJetpackBanner = Self.shouldHideJetpackBanner(
20+
contentHeight: scrollView.contentSize.height,
21+
frameHeight: scrollView.frame.height,
22+
verticalContentOffset: scrollView.contentOffset.y + scrollView.adjustedContentInset.top
23+
)
24+
25+
scrollViewTranslationPublisher.send(shouldHideJetpackBanner)
26+
}
27+
28+
static func shouldHideJetpackBanner(
29+
contentHeight: CGFloat,
30+
frameHeight: CGFloat,
31+
verticalContentOffset: CGFloat
32+
) -> Bool {
33+
/// The scrollable content isn't any larger than its frame, so don't hide the banner if the view is bounced.
34+
if contentHeight <= frameHeight {
35+
return false
36+
/// Don't hide the banner until the view has scrolled down some. Currently the height of the banner itself.
37+
} else if verticalContentOffset <= JetpackBannerView.minimumHeight {
38+
return false
39+
}
40+
41+
return true
42+
}
1643
}

WordPress/Classes/ViewRelated/Jetpack/Branding/Banner/JetpackBannerView.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,15 @@ class JetpackBannerView: UIView {
4747
// MARK: Responding to scroll events
4848
extension JetpackBannerView: Subscriber {
4949

50-
typealias Input = CGFloat
50+
typealias Input = Bool
5151
typealias Failure = Never
5252

5353
func receive(subscription: Subscription) {
5454
subscription.request(.unlimited)
5555
}
5656

57-
func receive(_ input: CGFloat) -> Subscribers.Demand {
58-
59-
let isHidden: Bool = input < 0
57+
func receive(_ input: Bool) -> Subscribers.Demand {
58+
let isHidden = input
6059

6160
guard self.isHidden != isHidden else {
6261
return .unlimited

WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationsViewController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ class NotificationsViewController: UIViewController, UIViewControllerRestoration
135135
}()
136136

137137
/// Used by JPScrollViewDelegate to send scroll position
138-
internal let scrollViewTranslationPublisher = PassthroughSubject<CGFloat, Never>()
138+
internal let scrollViewTranslationPublisher = PassthroughSubject<Bool, Never>()
139139

140140
// MARK: - View Lifecycle
141141

@@ -2075,6 +2075,6 @@ extension NotificationsViewController: WPScrollableViewController {
20752075
//
20762076
extension NotificationsViewController: JPScrollViewDelegate {
20772077
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
2078-
scrollViewTranslationPublisher.send(scrollView.panGestureRecognizer.translation(in: scrollView.superview).y)
2078+
processJetpackBannerVisibility(scrollView)
20792079
}
20802080
}

WordPress/Classes/ViewRelated/Reader/ReaderSiteSearchViewController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class ReaderSiteSearchViewController: UITableViewController, UIViewControllerRes
5454

5555
// MARK: - JPScrollViewDelegate
5656

57-
let scrollViewTranslationPublisher = PassthroughSubject<CGFloat, Never>()
57+
let scrollViewTranslationPublisher = PassthroughSubject<Bool, Never>()
5858

5959
// MARK: - View lifecycle
6060

@@ -411,6 +411,6 @@ class ReaderSiteSearchFooterView: UIView {
411411

412412
extension ReaderSiteSearchViewController: JPScrollViewDelegate {
413413
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
414-
scrollViewTranslationPublisher.send(scrollView.panGestureRecognizer.translation(in: scrollView.superview).y)
414+
processJetpackBannerVisibility(scrollView)
415415
}
416416
}

WordPress/Classes/ViewRelated/Reader/ReaderStreamViewController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ import Combine
101101
private var didSetupView = false
102102
private var listentingForBlockedSiteNotification = false
103103
private var didBumpStats = false
104-
internal let scrollViewTranslationPublisher = PassthroughSubject<CGFloat, Never>()
104+
internal let scrollViewTranslationPublisher = PassthroughSubject<Bool, Never>()
105105

106106
/// Content management
107107
let content = ReaderTableContent()
@@ -2006,6 +2006,6 @@ extension ReaderStreamViewController: ReaderTopicsChipsDelegate {
20062006

20072007
extension ReaderStreamViewController: UITableViewDelegate, JPScrollViewDelegate {
20082008
func scrollViewDidScroll(_ scrollView: UIScrollView) {
2009-
scrollViewTranslationPublisher.send(scrollView.panGestureRecognizer.translation(in: scrollView.superview).y)
2009+
processJetpackBannerVisibility(scrollView)
20102010
}
20112011
}

WordPress/Classes/ViewRelated/Stats/Helpers/BottomScrollAnalyticsTracker.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Foundation
55

66
final class BottomScrollAnalyticsTracker: NSObject {
77

8-
let scrollViewTranslationPublisher = PassthroughSubject<CGFloat, Never>()
8+
let scrollViewTranslationPublisher = PassthroughSubject<Bool, Never>()
99

1010
private func captureAnalyticsEvent(_ event: WPAnalyticsStat) {
1111
if let blogIdentifier = SiteStatsInformation.sharedInstance.siteID {
@@ -39,6 +39,6 @@ extension BottomScrollAnalyticsTracker: JPScrollViewDelegate {
3939
}
4040
}
4141
func scrollViewDidScroll(_ scrollView: UIScrollView) {
42-
scrollViewTranslationPublisher.send(scrollView.panGestureRecognizer.translation(in: scrollView.superview).y)
42+
processJetpackBannerVisibility(scrollView)
4343
}
4444
}

0 commit comments

Comments
 (0)