Skip to content

Commit dfe6905

Browse files
authored
Merge pull request #3687 from wikimedia/fix_on_this_day_header
Fix on this day header - merge into main
2 parents 03e614d + ed062ea commit dfe6905

File tree

3 files changed

+49
-7
lines changed

3 files changed

+49
-7
lines changed

Wikipedia/Code/NavigationBarHider.swift

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,49 @@ public class NavigationBarHider: NSObject {
3232

3333
fileprivate var isUserScrolling: Bool = false
3434
fileprivate var isScrollingToTop: Bool = false
35+
fileprivate var isProgramaticallyScrolling: Bool = false
3536
var initialScrollY: CGFloat = 0
3637
var initialNavigationBarPercentHidden: CGFloat = 0
38+
39+
private func setDataForScroll(yOffset: CGFloat, topContentInset: CGFloat) {
40+
guard let navigationBar = navigationBar else {
41+
return
42+
}
43+
initialScrollY = yOffset + topContentInset
44+
initialNavigationBarPercentHidden = navigationBar.navigationBarPercentHidden
45+
}
46+
47+
public func setIsProgramaticallyScrolling(_ isProgramaticallyScrolling: Bool, yOffset: CGFloat, topContentInset: CGFloat) {
48+
guard navigationBar?.isInteractiveHidingEnabled == true else {
49+
return
50+
}
51+
52+
self.isProgramaticallyScrolling = isProgramaticallyScrolling
53+
54+
if isProgramaticallyScrolling {
55+
setDataForScroll(yOffset: yOffset, topContentInset: topContentInset)
56+
}
57+
}
3758

3859
@objc public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
39-
guard let navigationBar = navigationBar, navigationBar.isInteractiveHidingEnabled else {
60+
guard navigationBar?.isInteractiveHidingEnabled == true else {
4061
return
4162
}
4263
isUserScrolling = true
43-
initialScrollY = scrollView.contentOffset.y + scrollView.contentInset.top
44-
initialNavigationBarPercentHidden = navigationBar.navigationBarPercentHidden
64+
setDataForScroll(yOffset: scrollView.contentOffset.y, topContentInset: scrollView.contentInset.top)
4565
}
4666

4767
@objc public func scrollViewDidScroll(_ scrollView: UIScrollView) {
4868
guard let navigationBar = navigationBar else {
4969
return
5070
}
51-
71+
72+
if isProgramaticallyScrolling {
73+
/// When programatically scrolling on a just-created scroll view, we need a layout pass to get accurate heights.
74+
scrollView.layoutIfNeeded()
75+
navigationBar.layoutIfNeeded()
76+
}
77+
5278
guard scrollView.contentSize.height > 0 else {
5379
if navigationBar.isAdjustingHidingFromContentInsetChangesEnabled {
5480
navigationBar.setNavigationBarPercentHidden(0, underBarViewPercentHidden: 0, extendedViewPercentHidden: 0, topSpacingPercentHidden: 0, animated: false)
@@ -78,7 +104,7 @@ public class NavigationBarHider: NSObject {
78104
}
79105
}
80106

81-
guard navigationBar.isInteractiveHidingEnabled, isUserScrolling || isScrollingToTop || scrollY < totalHideableHeight else {
107+
guard navigationBar.isInteractiveHidingEnabled, isUserScrolling || isScrollingToTop || isProgramaticallyScrolling || scrollY < totalHideableHeight else {
82108
return
83109
}
84110

@@ -234,8 +260,7 @@ public class NavigationBarHider: NSObject {
234260
guard let navigationBar = navigationBar, navigationBar.isInteractiveHidingEnabled else {
235261
return
236262
}
237-
initialNavigationBarPercentHidden = navigationBar.navigationBarPercentHidden
238-
initialScrollY = scrollView.contentOffset.y + scrollView.contentInset.top
263+
setDataForScroll(yOffset: scrollView.contentOffset.y, topContentInset: scrollView.contentInset.top)
239264
isScrollingToTop = true
240265
}
241266

Wikipedia/Code/OnThisDayViewController.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ class OnThisDayViewController: ColumnarCollectionViewController, DetailPresentin
9696
return
9797
}
9898
let sectionIndex = eventIndex + 1 // index + 1 because section 0 is the header
99+
isProgramaticallyScrolling = true
99100
collectionView.scrollToItem(at: IndexPath(item: 0, section: sectionIndex), at: sectionIndex < 1 ? .top : .centeredVertically, animated: false)
101+
isProgramaticallyScrolling = false
100102
}
101103

102104
override func scrollViewInsetsDidChange() {
@@ -147,6 +149,12 @@ class OnThisDayViewController: ColumnarCollectionViewController, DetailPresentin
147149
// MARK: - ColumnarCollectionViewLayoutDelegate
148150

149151
override func collectionView(_ collectionView: UICollectionView, estimatedHeightForHeaderInSection section: Int, forColumnWidth columnWidth: CGFloat) -> ColumnarCollectionViewLayoutHeightEstimate {
152+
153+
/// When presenting with navigation bar, first two section headers do not exist.
154+
guard !shouldShowNavigationBar || section >= 2 else {
155+
return ColumnarCollectionViewLayoutHeightEstimate(precalculated: false, height: 0)
156+
}
157+
150158
guard section > 0 else {
151159
return super.collectionView(collectionView, estimatedHeightForHeaderInSection: section, forColumnWidth: columnWidth)
152160
}

Wikipedia/Code/ViewController.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ class ViewController: PreviewingViewController, NavigationBarHiderDelegate {
2929
return NavigationBarHider()
3030
}()
3131

32+
var isProgramaticallyScrolling: Bool = false {
33+
didSet {
34+
guard let yOffset = scrollView?.contentOffset.y, let topInset = scrollView?.contentInset.top else {
35+
return
36+
}
37+
navigationBarHider.setIsProgramaticallyScrolling(isProgramaticallyScrolling, yOffset: yOffset, topContentInset: topInset)
38+
}
39+
}
40+
3241
private var keyboardFrame: CGRect? {
3342
didSet {
3443
keyboardDidChangeFrame(from: oldValue, newKeyboardFrame: keyboardFrame)

0 commit comments

Comments
 (0)