From 9f4c1be56d58bdbe012ab9c654fa5822b5c3da8c Mon Sep 17 00:00:00 2001 From: Ivan Vorobei Date: Wed, 10 Jul 2019 21:46:53 +0300 Subject: [PATCH] Update to 1.7.1 Add confirmation to dismiss by scroll. Change `SPStorkControllerConfirmDelegate` to required methods. Update example. --- .../UserInterfaceState.xcuserstate | Bin 55489 -> 54576 bytes Example/stork-controller/Controller.swift | 1 + .../SPStorkControllerConfirmDelegate.swift | 4 +-- .../SPStorkController/SPStorkController.swift | 33 ++++++++++++++---- .../SPStorkPresentationController.swift | 28 ++++++++++----- .../ModalTableViewController.swift | 18 ++++++++++ .../ModalViewController.swift | 2 +- README.md | 4 +-- SPStorkController.podspec | 2 +- .../SPStorkControllerConfirmDelegate.swift | 4 +-- .../SPStorkController/SPStorkController.swift | 33 ++++++++++++++---- .../SPStorkPresentationController.swift | 28 ++++++++++----- 12 files changed, 119 insertions(+), 38 deletions(-) diff --git a/Example/stork-controller.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate b/Example/stork-controller.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate index de825f13d21aeebb79ed5161d3a0f6905a02f8d6..e8b36118a162630445ccc6e97349dc27d6d658c6 100644 GIT binary patch delta 26618 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%0AE*RrAbp`!W+b~a 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 delta 26699 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 rlk2k?#^?VFx{rn% diff --git a/Example/stork-controller/Controller.swift b/Example/stork-controller/Controller.swift index bc2265c..532c33d 100644 --- a/Example/stork-controller/Controller.swift +++ b/Example/stork-controller/Controller.swift @@ -39,6 +39,7 @@ class Controller: UIViewController { let modal = ModalTableViewController() let transitionDelegate = SPStorkTransitioningDelegate() transitionDelegate.storkDelegate = self + transitionDelegate.confirmDelegate = modal modal.transitioningDelegate = transitionDelegate modal.modalPresentationStyle = .custom self.present(modal, animated: true, completion: nil) diff --git a/Example/stork-controller/Frameworks/SPStorkController/Protocols/SPStorkControllerConfirmDelegate.swift b/Example/stork-controller/Frameworks/SPStorkController/Protocols/SPStorkControllerConfirmDelegate.swift index e9dd311..adf549e 100644 --- a/Example/stork-controller/Frameworks/SPStorkController/Protocols/SPStorkControllerConfirmDelegate.swift +++ b/Example/stork-controller/Frameworks/SPStorkController/Protocols/SPStorkControllerConfirmDelegate.swift @@ -23,7 +23,7 @@ import UIKit @objc public protocol SPStorkControllerConfirmDelegate: class { - @objc optional var needConfirm: Bool { get } + var needConfirm: Bool { get } - @objc optional func confirm(_ completion: @escaping (_ isConfirmed: Bool)->()) + func confirm(_ completion: @escaping (_ isConfirmed: Bool)->()) } diff --git a/Example/stork-controller/Frameworks/SPStorkController/SPStorkController.swift b/Example/stork-controller/Frameworks/SPStorkController/SPStorkController.swift index 1cf7869..11704c7 100755 --- a/Example/stork-controller/Frameworks/SPStorkController/SPStorkController.swift +++ b/Example/stork-controller/Frameworks/SPStorkController/SPStorkController.swift @@ -32,16 +32,35 @@ public enum SPStorkController { scrollView.subviews.forEach { $0.transform = CGAffineTransform(translationX: 0, y: -translation) } - /* Maybe migrate to it in future. Bug with bottom safe area - scrollView.transform = CGAffineTransform(translationX: 0, y: -translation) - scrollView.scrollIndicatorInsets.top = (indicatorInset ?? 0) + translation - */ presentationController.setIndicator(style: scrollView.isTracking ? .line : .arrow) if translation >= presentationController.translateForDismiss * 0.4 { if !scrollView.isTracking && !scrollView.isDragging { - presentationController.presentedViewController.dismiss(animated: true, completion: { - presentationController.storkDelegate?.didDismissStorkBySwipe?() - }) + + let dismiss = { + presentationController.presentedViewController.dismiss(animated: true, completion: { + presentationController.storkDelegate?.didDismissStorkBySwipe?() + }) + } + + guard let confirmDelegate = presentationController.confirmDelegate else { + dismiss() + return + } + + if presentationController.workConfirmation { return } + + if confirmDelegate.needConfirm { + presentationController.workConfirmation = true + confirmDelegate.confirm({ (isConfirmed) in + presentationController.workConfirmation = false + if isConfirmed { + dismiss() + } + }) + } else { + dismiss() + } + return } } diff --git a/Example/stork-controller/Frameworks/SPStorkController/TransitioningDelegate/SPStorkPresentationController.swift b/Example/stork-controller/Frameworks/SPStorkController/TransitioningDelegate/SPStorkPresentationController.swift index 65d4c7c..4454f71 100755 --- a/Example/stork-controller/Frameworks/SPStorkController/TransitioningDelegate/SPStorkPresentationController.swift +++ b/Example/stork-controller/Frameworks/SPStorkController/TransitioningDelegate/SPStorkPresentationController.swift @@ -50,7 +50,8 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz private var snapshotViewTopConstraint: NSLayoutConstraint? private var snapshotViewWidthConstraint: NSLayoutConstraint? private var snapshotViewAspectRatioConstraint: NSLayoutConstraint? - + + var workConfirmation: Bool = false private var workGester: Bool = false private var startDismissing: Bool = false private var afterReleaseDismissing: Bool = false @@ -69,7 +70,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz return factor } - private var feedbackGenerator: UIImpactFeedbackGenerator = UIImpactFeedbackGenerator(style: .light) + private var feedbackGenerator = UIImpactFeedbackGenerator(style: .light) override var presentedView: UIView? { let view = self.presentedViewController.view @@ -358,9 +359,20 @@ extension SPStorkPresentationController { } if translation >= self.translateForDismiss { - if self.confirmDelegate?.needConfirm ?? false { + + guard let confirmDelegate = self.confirmDelegate else { + dismissBySwipe() + return + } + + if self.workConfirmation { return } + + if confirmDelegate.needConfirm { returnToDefault() - self.confirmDelegate?.confirm?({ (isConfirmed) in + self.workConfirmation = true + confirmDelegate.confirm({ (isConfirmed) in + self.workConfirmation = false + self.afterReleaseDismissing = false if isConfirmed { dismissBySwipe() } @@ -446,8 +458,10 @@ extension SPStorkPresentationController { let afterRealseDismissing = (translation >= self.translateForDismiss) if afterRealseDismissing != self.afterReleaseDismissing { self.afterReleaseDismissing = afterRealseDismissing - if self.hapticMoments.contains(.willDismissIfRelease) { - self.feedbackGenerator.impactOccurred() + if !self.workConfirmation { + if self.hapticMoments.contains(.willDismissIfRelease) { + self.feedbackGenerator.impactOccurred() + } } } } @@ -479,8 +493,6 @@ extension SPStorkPresentationController { private func updateLayoutIndicator() { self.indicatorView.style = .line self.indicatorView.sizeToFit() - //self.indicatorView.frame.origin.y = 12 - //self.indicatorView.center.x = presentedView.frame.width / 2 } private func updateLayoutCloseButton() { diff --git a/Example/stork-controller/ModalTableViewController.swift b/Example/stork-controller/ModalTableViewController.swift index 54c24a5..bffac49 100644 --- a/Example/stork-controller/ModalTableViewController.swift +++ b/Example/stork-controller/ModalTableViewController.swift @@ -79,3 +79,21 @@ extension ModalTableViewController: UITableViewDelegate { } } +extension ModalTableViewController: SPStorkControllerConfirmDelegate { + + var needConfirm: Bool { + return true + } + + func confirm(_ completion: @escaping (Bool) -> ()) { + print("confirm") + let alertController = UIAlertController(title: "Need dismiss?", message: "It test confirm option for SPStorkController", preferredStyle: .actionSheet) + alertController.addDestructiveAction(title: "Confirm", complection: { + completion(true) + }) + alertController.addCancelAction(title: "Cancel") { + completion(false) + } + self.present(alertController) + } +} diff --git a/Example/stork-controller/ModalViewController.swift b/Example/stork-controller/ModalViewController.swift index d6bdbd4..65875e0 100644 --- a/Example/stork-controller/ModalViewController.swift +++ b/Example/stork-controller/ModalViewController.swift @@ -40,7 +40,7 @@ extension ModalViewController: SPStorkControllerConfirmDelegate { func confirm(_ completion: @escaping (Bool) -> ()) { let alertController = UIAlertController(title: "Need dismiss?", message: "It test confirm option for SPStorkController", preferredStyle: .actionSheet) - alertController.addAction(title: "Confirm", complection: { + alertController.addDestructiveAction(title: "Confirm", complection: { completion(true) }) alertController.addCancelAction(title: "Cancel") { diff --git a/README.md b/README.md index 2c4736c..c014443 100644 --- a/README.md +++ b/README.md @@ -282,9 +282,9 @@ For confirm closing by swipe, use `SPStorkControllerConfirmDelegate`. Implenet p ```swift @objc public protocol SPStorkControllerConfirmDelegate: class { - @objc optional var needConfirm: Bool { get } + var needConfirm: Bool { get } - @objc optional func confirm(_ completion: @escaping (_ isConfirmed: Bool)->()) + func confirm(_ completion: @escaping (_ isConfirmed: Bool)->()) } ``` diff --git a/SPStorkController.podspec b/SPStorkController.podspec index 209f63e..be8e19d 100644 --- a/SPStorkController.podspec +++ b/SPStorkController.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "SPStorkController" - s.version = "1.7" + s.version = "1.7.1" s.summary = "Very similar to the controllers displayed in Apple Music, Podcasts and Mail Apple's applications." s.homepage = "https://github.com/IvanVorobei/SPStorkController" s.source = { :git => "https://github.com/IvanVorobei/SPStorkController.git", :tag => s.version } diff --git a/Source/SPStorkController/Protocols/SPStorkControllerConfirmDelegate.swift b/Source/SPStorkController/Protocols/SPStorkControllerConfirmDelegate.swift index e9dd311..adf549e 100644 --- a/Source/SPStorkController/Protocols/SPStorkControllerConfirmDelegate.swift +++ b/Source/SPStorkController/Protocols/SPStorkControllerConfirmDelegate.swift @@ -23,7 +23,7 @@ import UIKit @objc public protocol SPStorkControllerConfirmDelegate: class { - @objc optional var needConfirm: Bool { get } + var needConfirm: Bool { get } - @objc optional func confirm(_ completion: @escaping (_ isConfirmed: Bool)->()) + func confirm(_ completion: @escaping (_ isConfirmed: Bool)->()) } diff --git a/Source/SPStorkController/SPStorkController.swift b/Source/SPStorkController/SPStorkController.swift index 1cf7869..11704c7 100755 --- a/Source/SPStorkController/SPStorkController.swift +++ b/Source/SPStorkController/SPStorkController.swift @@ -32,16 +32,35 @@ public enum SPStorkController { scrollView.subviews.forEach { $0.transform = CGAffineTransform(translationX: 0, y: -translation) } - /* Maybe migrate to it in future. Bug with bottom safe area - scrollView.transform = CGAffineTransform(translationX: 0, y: -translation) - scrollView.scrollIndicatorInsets.top = (indicatorInset ?? 0) + translation - */ presentationController.setIndicator(style: scrollView.isTracking ? .line : .arrow) if translation >= presentationController.translateForDismiss * 0.4 { if !scrollView.isTracking && !scrollView.isDragging { - presentationController.presentedViewController.dismiss(animated: true, completion: { - presentationController.storkDelegate?.didDismissStorkBySwipe?() - }) + + let dismiss = { + presentationController.presentedViewController.dismiss(animated: true, completion: { + presentationController.storkDelegate?.didDismissStorkBySwipe?() + }) + } + + guard let confirmDelegate = presentationController.confirmDelegate else { + dismiss() + return + } + + if presentationController.workConfirmation { return } + + if confirmDelegate.needConfirm { + presentationController.workConfirmation = true + confirmDelegate.confirm({ (isConfirmed) in + presentationController.workConfirmation = false + if isConfirmed { + dismiss() + } + }) + } else { + dismiss() + } + return } } diff --git a/Source/SPStorkController/TransitioningDelegate/SPStorkPresentationController.swift b/Source/SPStorkController/TransitioningDelegate/SPStorkPresentationController.swift index 65d4c7c..4454f71 100755 --- a/Source/SPStorkController/TransitioningDelegate/SPStorkPresentationController.swift +++ b/Source/SPStorkController/TransitioningDelegate/SPStorkPresentationController.swift @@ -50,7 +50,8 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz private var snapshotViewTopConstraint: NSLayoutConstraint? private var snapshotViewWidthConstraint: NSLayoutConstraint? private var snapshotViewAspectRatioConstraint: NSLayoutConstraint? - + + var workConfirmation: Bool = false private var workGester: Bool = false private var startDismissing: Bool = false private var afterReleaseDismissing: Bool = false @@ -69,7 +70,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz return factor } - private var feedbackGenerator: UIImpactFeedbackGenerator = UIImpactFeedbackGenerator(style: .light) + private var feedbackGenerator = UIImpactFeedbackGenerator(style: .light) override var presentedView: UIView? { let view = self.presentedViewController.view @@ -358,9 +359,20 @@ extension SPStorkPresentationController { } if translation >= self.translateForDismiss { - if self.confirmDelegate?.needConfirm ?? false { + + guard let confirmDelegate = self.confirmDelegate else { + dismissBySwipe() + return + } + + if self.workConfirmation { return } + + if confirmDelegate.needConfirm { returnToDefault() - self.confirmDelegate?.confirm?({ (isConfirmed) in + self.workConfirmation = true + confirmDelegate.confirm({ (isConfirmed) in + self.workConfirmation = false + self.afterReleaseDismissing = false if isConfirmed { dismissBySwipe() } @@ -446,8 +458,10 @@ extension SPStorkPresentationController { let afterRealseDismissing = (translation >= self.translateForDismiss) if afterRealseDismissing != self.afterReleaseDismissing { self.afterReleaseDismissing = afterRealseDismissing - if self.hapticMoments.contains(.willDismissIfRelease) { - self.feedbackGenerator.impactOccurred() + if !self.workConfirmation { + if self.hapticMoments.contains(.willDismissIfRelease) { + self.feedbackGenerator.impactOccurred() + } } } } @@ -479,8 +493,6 @@ extension SPStorkPresentationController { private func updateLayoutIndicator() { self.indicatorView.style = .line self.indicatorView.sizeToFit() - //self.indicatorView.frame.origin.y = 12 - //self.indicatorView.center.x = presentedView.frame.width / 2 } private func updateLayoutCloseButton() {