Last active
July 24, 2021 06:43
-
-
Save adam-leitgeb/95c049dd923d45a20dee288dab0b1854 to your computer and use it in GitHub Desktop.
Onboarding with scaling image.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
typealias Interval = (a: CGFloat, b: CGFloat) | |
extension OnboardingViewController: UIScrollViewDelegate { | |
func scrollViewDidScroll(_ scrollView: UIScrollView) { | |
let pageIndex = round(scrollView.contentOffset.x / scrollView.frame.width) | |
pageControl.currentPage = Int(pageIndex) | |
let maximumHorizontalOffset: CGFloat = scrollView.contentSize.width - scrollView.frame.width | |
let currentHorizontalOffset: CGFloat = scrollView.contentOffset.x | |
let percentageHorizontalOffset: CGFloat = currentHorizontalOffset / maximumHorizontalOffset | |
let percentOffset: CGPoint = CGPoint(x: percentageHorizontalOffset, y: 0.0) | |
let intervals = makeIntervals(split: 1.0, by: pageControl.numberOfPages - 1) | |
guard let interval = intervals.enumerated().first(where: { percentOffset.x > $0.element.a && percentOffset.x <= $0.element.b }) else { | |
return | |
} | |
guard percentOffset.x > 0.0 && percentOffset.x <= 1, (interval.offset + 1) < onboardingViews.count else { | |
return | |
} | |
let scaleFactor = 1.0 / CGFloat(pageControl.numberOfPages - 1) | |
let scale0 = (interval.element.b - percentOffset.x) / scaleFactor | |
let scale1 = percentOffset.x / interval.element.b | |
onboardingViews[interval.offset].scaleImage(scale: scale0) | |
onboardingViews[interval.offset + 1].scaleImage(scale: scale1) | |
} | |
// MARK: - Utilities | |
private func makeIntervals(split whole: CGFloat, by n: Int) -> [Interval] { | |
let step: CGFloat = whole / CGFloat(n) | |
let iterations: [CGFloat] = Array.init(repeating: step, count: n) | |
return iterations | |
.enumerated() | |
.map { Interval(a: $0.element * CGFloat($0.offset), b: $0.element * CGFloat($0.offset + 1)) } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Great. I am wondering where is scaleImage method?