Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adam-leitgeb/95c049dd923d45a20dee288dab0b1854 to your computer and use it in GitHub Desktop.
Save adam-leitgeb/95c049dd923d45a20dee288dab0b1854 to your computer and use it in GitHub Desktop.
Onboarding with scaling image.
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)) }
}
}
@ahmi
Copy link

ahmi commented Jul 24, 2021

Great. I am wondering where is scaleImage method?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment