Skip to content

Commit

Permalink
Merge pull request #1484 from HedvigInsurance/improvement/insurance-d…
Browse files Browse the repository at this point in the history
…etails-scrolling

Improvement/insurance details scrolling
  • Loading branch information
sladan-hedvig authored Aug 30, 2024
2 parents 00028bd + 5c42bc4 commit cdfb2cb
Showing 1 changed file with 33 additions and 7 deletions.
40 changes: 33 additions & 7 deletions Projects/Contracts/Sources/View/ScrollableSegmentedView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -191,11 +191,17 @@ class ScrollableSegmentedViewModel: NSObject, ObservableObject {

func scrollToNearestWith(offset: CGFloat) {
let allOffsets = getPagesOffset()
let offsetToScrollTo = allOffsets.min(by: { abs($0 - offset) < abs($1 - offset) }) ?? 0
if let index = allOffsets.firstIndex(of: offsetToScrollTo) {
let nearestTabOffset = getNearestTabOffset(for: offset)
if let index = allOffsets.firstIndex(of: nearestTabOffset) {
setSelectedTab(with: pageModels[index].id)
}
scrollTo(offset: offsetToScrollTo)
scrollTo(offset: nearestTabOffset)
}

func getNearestTabOffset(for offset: CGFloat) -> CGFloat {
let allOffsets = getPagesOffset()
let offsetToScrollTo = allOffsets.min(by: { abs($0 - offset) < abs($1 - offset) }) ?? 0
return offsetToScrollTo
}

func setSelectedTab(with id: String) {
Expand All @@ -222,16 +228,36 @@ class ScrollableSegmentedViewModel: NSObject, ObservableObject {
}

extension ScrollableSegmentedViewModel: UIScrollViewDelegate {
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
scrollToNearestWith(offset: scrollView.contentOffset.x)
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if !decelerate {
scrollToNearestWith(offset: scrollView.contentOffset.x)
}
}

func scrollViewWillEndDragging(
_ scrollView: UIScrollView,
withVelocity velocity: CGPoint,
targetContentOffset: UnsafeMutablePointer<CGPoint>
) {
if velocity.x != 0 {
if #available(iOS 17.4, *) {
scrollView.stopScrollingAndZooming()
}
let scrollTo = getNearestTabOffset(for: targetContentOffset.pointee.x)
DispatchQueue.main.async { [weak scrollView] in
UIView.animate(
withDuration: 0.3,
delay: 0,
options: UIView.AnimationOptions.curveEaseOut,
animations: {
scrollView?.contentOffset.x = scrollTo
},
completion: nil
)
}
}
}

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
currentHeight = heights.values.max(by: { $1 > $0 }) ?? 0
}
Expand Down

0 comments on commit cdfb2cb

Please sign in to comment.