From 393bedce0b1d91efd1452e05a1243ce316ab8668 Mon Sep 17 00:00:00 2001 From: Merrick Sapsford Date: Fri, 23 Feb 2018 15:08:07 +0100 Subject: [PATCH 1/6] Rename activeTransitionOperation --- .../PageboyViewController+Transitioning.swift | 10 +++++----- Sources/Pageboy/PageboyViewController.swift | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift b/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift index 49390675..92c19a3b 100644 --- a/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift +++ b/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift @@ -75,7 +75,7 @@ internal extension PageboyViewController { // MARK: Animation @objc func displayLinkDidTick() { - self.activeTransition?.tick() + self.activeTransitionOperation?.tick() } /// Perform a transition to a new page index. @@ -91,7 +91,7 @@ internal extension PageboyViewController { with direction: NavigationDirection, animated: Bool, completion: @escaping TransitionOperation.Completion) { - guard animated == true, self.activeTransition == nil else { + guard animated == true, self.activeTransitionOperation == nil else { return } guard let scrollView = self.pageViewController?.scrollView else { @@ -112,13 +112,13 @@ internal extension PageboyViewController { direction: direction, semanticDirection: semanticDirection, orientation: self.navigationOrientation) - self.activeTransition = TransitionOperation(for: self.transition, + self.activeTransitionOperation = TransitionOperation(for: self.transition, action: action, delegate: self) self.transitionDisplayLink?.isPaused = false // start transition - self.activeTransition?.start(on: scrollView.layer, + self.activeTransitionOperation?.start(on: scrollView.layer, completion: completion) } } @@ -128,7 +128,7 @@ extension PageboyViewController: TransitionOperationDelegate { func transitionOperation(_ operation: TransitionOperation, didFinish finished: Bool) { self.transitionDisplayLink?.isPaused = true - self.activeTransition = nil + self.activeTransitionOperation = nil clearUpAfterTransition() } diff --git a/Sources/Pageboy/PageboyViewController.swift b/Sources/Pageboy/PageboyViewController.swift index 605d46e8..56bb9c41 100644 --- a/Sources/Pageboy/PageboyViewController.swift +++ b/Sources/Pageboy/PageboyViewController.swift @@ -159,7 +159,7 @@ open class PageboyViewController: UIViewController { /// The display link for transitioning. internal var transitionDisplayLink: CADisplayLink? /// The active transition operation. - internal var activeTransition: TransitionOperation? + internal var activeTransitionOperation: TransitionOperation? /// The number of view controllers in the page view controller. internal var viewControllerCount: Int? From b2cce6b486db19d84b5d5081f20384a0df1fb615 Mon Sep 17 00:00:00 2001 From: Merrick Sapsford Date: Fri, 23 Feb 2018 15:23:33 +0100 Subject: [PATCH 2/6] Update to support default UIPageViewController transition --- .../PageboyViewController+Management.swift | 20 ++++++++++++------- .../PageboyViewController+Transitioning.swift | 11 ++++++---- Sources/Pageboy/PageboyViewController.swift | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Sources/Pageboy/Extensions/PageboyViewController+Management.swift b/Sources/Pageboy/Extensions/PageboyViewController+Management.swift index 91579b49..01c9544d 100644 --- a/Sources/Pageboy/Extensions/PageboyViewController+Management.swift +++ b/Sources/Pageboy/Extensions/PageboyViewController+Management.swift @@ -50,21 +50,27 @@ internal extension PageboyViewController { targetIndex = toIndex isUpdatingViewControllers = true - performTransition(from: fromIndex, - to: toIndex, - with: direction, - animated: animated, - completion: completion ?? { _ in }) + let isUsingCustomTransition = transition != nil + if isUsingCustomTransition { + performTransition(from: fromIndex, + to: toIndex, + with: direction, + animated: animated, + completion: completion ?? { _ in }) + } + + // if not using a custom transition then animate using UIPageViewController mechanism + let animateUpdate = animated ? !isUsingCustomTransition : false let updateBlock = { pageViewController.setViewControllers(viewControllers, direction: direction.pageViewControllerNavDirection, - animated: false, + animated: animateUpdate, completion: { (finished) in self.isUpdatingViewControllers = false - if !animated { + if !animated || !isUsingCustomTransition { completion?(finished) } }) diff --git a/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift b/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift index 92c19a3b..2162f4bc 100644 --- a/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift +++ b/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift @@ -91,11 +91,14 @@ internal extension PageboyViewController { with direction: NavigationDirection, animated: Bool, completion: @escaping TransitionOperation.Completion) { - guard animated == true, self.activeTransitionOperation == nil else { - return + guard let transition = self.transition, + animated == true, + self.activeTransitionOperation == nil else { + completion(false) + return } guard let scrollView = self.pageViewController?.scrollView else { - return + fatalError("Can't find UIPageViewController scroll view") } prepareForTransition() @@ -112,7 +115,7 @@ internal extension PageboyViewController { direction: direction, semanticDirection: semanticDirection, orientation: self.navigationOrientation) - self.activeTransitionOperation = TransitionOperation(for: self.transition, + self.activeTransitionOperation = TransitionOperation(for: transition, action: action, delegate: self) self.transitionDisplayLink?.isPaused = false diff --git a/Sources/Pageboy/PageboyViewController.swift b/Sources/Pageboy/PageboyViewController.swift index 56bb9c41..a2030f9b 100644 --- a/Sources/Pageboy/PageboyViewController.swift +++ b/Sources/Pageboy/PageboyViewController.swift @@ -155,7 +155,7 @@ open class PageboyViewController: UIViewController { internal var isUpdatingViewControllers: Bool = false /// The transition to use when animating scrolls between pages. - public var transition = Transition.default + public var transition: Transition? /// The display link for transitioning. internal var transitionDisplayLink: CADisplayLink? /// The active transition operation. From d8b7ce1e63f0e3d5bd8e3d3a56b1219faa0fff0b Mon Sep 17 00:00:00 2001 From: Merrick Sapsford Date: Fri, 23 Feb 2018 15:25:53 +0100 Subject: [PATCH 3/6] Clean up property functions --- Sources/Pageboy/PageboyViewController.swift | 37 +++++++++++---------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/Sources/Pageboy/PageboyViewController.swift b/Sources/Pageboy/PageboyViewController.swift index a2030f9b..17821dfa 100644 --- a/Sources/Pageboy/PageboyViewController.swift +++ b/Sources/Pageboy/PageboyViewController.swift @@ -180,23 +180,7 @@ open class PageboyViewController: UIViewController { guard let currentIndex = self.currentIndex else { return } - - #if os(iOS) - UIView.animate(withDuration: 0.3) { - self.setNeedsStatusBarAppearanceUpdate() - } - #endif - - // ensure position keeps in sync - self.currentPosition = CGPoint(x: self.navigationOrientation == .horizontal ? CGFloat(currentIndex) : 0.0, - y: self.navigationOrientation == .vertical ? CGFloat(currentIndex) : 0.0) - let direction = NavigationDirection.forPosition(CGFloat(currentIndex), - previous: CGFloat(oldValue ?? currentIndex)) - self.delegate?.pageboyViewController(self, - didScrollToPageAt: currentIndex, - direction: direction, - animated: self.isScrollingAnimated) - + update(forNew: currentIndex, from: oldValue) } } /// The relative page position that the page view controller is currently at. @@ -356,4 +340,23 @@ public extension PageboyViewController { return direction } + + private func update(forNew currentIndex: PageIndex, from oldIndex: PageIndex?) { + + #if os(iOS) + UIView.animate(withDuration: 0.3) { + self.setNeedsStatusBarAppearanceUpdate() + } + #endif + + // ensure position keeps in sync + self.currentPosition = CGPoint(x: self.navigationOrientation == .horizontal ? CGFloat(currentIndex) : 0.0, + y: self.navigationOrientation == .vertical ? CGFloat(currentIndex) : 0.0) + let direction = NavigationDirection.forPosition(CGFloat(currentIndex), + previous: CGFloat(oldIndex ?? currentIndex)) + self.delegate?.pageboyViewController(self, + didScrollToPageAt: currentIndex, + direction: direction, + animated: self.isScrollingAnimated) + } } From 01a410e927455ab0d7b2b6a2c54d9acbe1df585f Mon Sep 17 00:00:00 2001 From: Merrick Sapsford Date: Fri, 23 Feb 2018 15:26:46 +0100 Subject: [PATCH 4/6] Update comments --- Sources/Pageboy/PageboyViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/Pageboy/PageboyViewController.swift b/Sources/Pageboy/PageboyViewController.swift index 17821dfa..bf5df6fb 100644 --- a/Sources/Pageboy/PageboyViewController.swift +++ b/Sources/Pageboy/PageboyViewController.swift @@ -154,7 +154,8 @@ open class PageboyViewController: UIViewController { /// Whether the view controllers in the page view controller are currently updating. internal var isUpdatingViewControllers: Bool = false - /// The transition to use when animating scrolls between pages. + /// Custom transition to use when animating scrolls between pages. + /// Setting this to `nil` will revert to using the standard UIPageViewController animation. public var transition: Transition? /// The display link for transitioning. internal var transitionDisplayLink: CADisplayLink? From 084698a2a14dd620a4193a5f50129685d95f2973 Mon Sep 17 00:00:00 2001 From: Merrick Sapsford Date: Fri, 23 Feb 2018 15:29:45 +0100 Subject: [PATCH 5/6] Update README --- README.md | 2 ++ Sources/Pageboy.podspec | 24 ------------------------ 2 files changed, 2 insertions(+), 24 deletions(-) delete mode 100644 Sources/Pageboy.podspec diff --git a/README.md b/README.md index c7516010..5750a3e3 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,8 @@ The following styles are available: - `.moveIn` - `.reveal` +*Note: By default this is set to `nil`, which uses the standard animation provided by `UIPageViewController`.* + ### Auto Scrolling `PageboyAutoScroller` is available to set up timer based automatic scrolling of the `PageboyViewController`: diff --git a/Sources/Pageboy.podspec b/Sources/Pageboy.podspec deleted file mode 100644 index 42bc4076..00000000 --- a/Sources/Pageboy.podspec +++ /dev/null @@ -1,24 +0,0 @@ -Pod::Spec.new do |s| - - s.name = "Pageboy" - s.version = "0.0.1" - s.summary = "TODO" - - s.description = <<-DESC - TODO - DESC - - s.homepage = "https://github.com/MerrickSapsford/Pageboy" - #s.screenshots = "https://raw.githubusercontent.com/MerrickSapsford/MSSTabbedPageViewController/develop/Resource/MSSTabbedPageViewController.gif" - s.license = "MIT" - s.author = { "Merrick Sapsford" => "merrick@sapsford.tech" } - s.social_media_url = "http://twitter.com/MerrickSapsford" - - s.platform = :ios, "9.0" - s.source = { :git => "https://github.com/MerrickSapsford/Pageboy.git", :tag => s.version.to_s } - s.requires_arc = true - s.source_files = "Pageboy/**/*.{h,m,swift}" - s.resources = ['Source/**/*.{xib}'] - s.frameworks = 'UIKit' - -end From 9637fbf12707472e6f15c1d4f3963dad7083f570 Mon Sep 17 00:00:00 2001 From: Merrick Sapsford Date: Fri, 23 Feb 2018 15:31:44 +0100 Subject: [PATCH 6/6] Obselete custom default transition --- .../Pageboy/Extensions/PageboyViewController+Transitioning.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift b/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift index 2162f4bc..79253a67 100644 --- a/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift +++ b/Sources/Pageboy/Extensions/PageboyViewController+Transitioning.swift @@ -33,6 +33,7 @@ public extension PageboyViewController { public let duration: TimeInterval /// Default transition (Push, 0.3 second duration). + @available(*, obsoleted: 2.4.0, message:"To use the default transition, set PageboyViewController.transition to `nil`") public static var `default`: Transition { return Transition(style: .push, duration: 0.3) }