Skip to content

Commit 9f4c1be

Browse files
committed
Update to 1.7.1
Add confirmation to dismiss by scroll. Change `SPStorkControllerConfirmDelegate` to required methods. Update example.
1 parent de779ae commit 9f4c1be

12 files changed

Lines changed: 119 additions & 38 deletions

File tree

Example/stork-controller/Controller.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class Controller: UIViewController {
3939
let modal = ModalTableViewController()
4040
let transitionDelegate = SPStorkTransitioningDelegate()
4141
transitionDelegate.storkDelegate = self
42+
transitionDelegate.confirmDelegate = modal
4243
modal.transitioningDelegate = transitionDelegate
4344
modal.modalPresentationStyle = .custom
4445
self.present(modal, animated: true, completion: nil)

Example/stork-controller/Frameworks/SPStorkController/Protocols/SPStorkControllerConfirmDelegate.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import UIKit
2323

2424
@objc public protocol SPStorkControllerConfirmDelegate: class {
2525

26-
@objc optional var needConfirm: Bool { get }
26+
var needConfirm: Bool { get }
2727

28-
@objc optional func confirm(_ completion: @escaping (_ isConfirmed: Bool)->())
28+
func confirm(_ completion: @escaping (_ isConfirmed: Bool)->())
2929
}

Example/stork-controller/Frameworks/SPStorkController/SPStorkController.swift

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,35 @@ public enum SPStorkController {
3232
scrollView.subviews.forEach {
3333
$0.transform = CGAffineTransform(translationX: 0, y: -translation)
3434
}
35-
/* Maybe migrate to it in future. Bug with bottom safe area
36-
scrollView.transform = CGAffineTransform(translationX: 0, y: -translation)
37-
scrollView.scrollIndicatorInsets.top = (indicatorInset ?? 0) + translation
38-
*/
3935
presentationController.setIndicator(style: scrollView.isTracking ? .line : .arrow)
4036
if translation >= presentationController.translateForDismiss * 0.4 {
4137
if !scrollView.isTracking && !scrollView.isDragging {
42-
presentationController.presentedViewController.dismiss(animated: true, completion: {
43-
presentationController.storkDelegate?.didDismissStorkBySwipe?()
44-
})
38+
39+
let dismiss = {
40+
presentationController.presentedViewController.dismiss(animated: true, completion: {
41+
presentationController.storkDelegate?.didDismissStorkBySwipe?()
42+
})
43+
}
44+
45+
guard let confirmDelegate = presentationController.confirmDelegate else {
46+
dismiss()
47+
return
48+
}
49+
50+
if presentationController.workConfirmation { return }
51+
52+
if confirmDelegate.needConfirm {
53+
presentationController.workConfirmation = true
54+
confirmDelegate.confirm({ (isConfirmed) in
55+
presentationController.workConfirmation = false
56+
if isConfirmed {
57+
dismiss()
58+
}
59+
})
60+
} else {
61+
dismiss()
62+
}
63+
4564
return
4665
}
4766
}

Example/stork-controller/Frameworks/SPStorkController/TransitioningDelegate/SPStorkPresentationController.swift

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
5050
private var snapshotViewTopConstraint: NSLayoutConstraint?
5151
private var snapshotViewWidthConstraint: NSLayoutConstraint?
5252
private var snapshotViewAspectRatioConstraint: NSLayoutConstraint?
53-
53+
54+
var workConfirmation: Bool = false
5455
private var workGester: Bool = false
5556
private var startDismissing: Bool = false
5657
private var afterReleaseDismissing: Bool = false
@@ -69,7 +70,7 @@ class SPStorkPresentationController: UIPresentationController, UIGestureRecogniz
6970
return factor
7071
}
7172

72-
private var feedbackGenerator: UIImpactFeedbackGenerator = UIImpactFeedbackGenerator(style: .light)
73+
private var feedbackGenerator = UIImpactFeedbackGenerator(style: .light)
7374

7475
override var presentedView: UIView? {
7576
let view = self.presentedViewController.view
@@ -358,9 +359,20 @@ extension SPStorkPresentationController {
358359
}
359360

360361
if translation >= self.translateForDismiss {
361-
if self.confirmDelegate?.needConfirm ?? false {
362+
363+
guard let confirmDelegate = self.confirmDelegate else {
364+
dismissBySwipe()
365+
return
366+
}
367+
368+
if self.workConfirmation { return }
369+
370+
if confirmDelegate.needConfirm {
362371
returnToDefault()
363-
self.confirmDelegate?.confirm?({ (isConfirmed) in
372+
self.workConfirmation = true
373+
confirmDelegate.confirm({ (isConfirmed) in
374+
self.workConfirmation = false
375+
self.afterReleaseDismissing = false
364376
if isConfirmed {
365377
dismissBySwipe()
366378
}
@@ -446,8 +458,10 @@ extension SPStorkPresentationController {
446458
let afterRealseDismissing = (translation >= self.translateForDismiss)
447459
if afterRealseDismissing != self.afterReleaseDismissing {
448460
self.afterReleaseDismissing = afterRealseDismissing
449-
if self.hapticMoments.contains(.willDismissIfRelease) {
450-
self.feedbackGenerator.impactOccurred()
461+
if !self.workConfirmation {
462+
if self.hapticMoments.contains(.willDismissIfRelease) {
463+
self.feedbackGenerator.impactOccurred()
464+
}
451465
}
452466
}
453467
}
@@ -479,8 +493,6 @@ extension SPStorkPresentationController {
479493
private func updateLayoutIndicator() {
480494
self.indicatorView.style = .line
481495
self.indicatorView.sizeToFit()
482-
//self.indicatorView.frame.origin.y = 12
483-
//self.indicatorView.center.x = presentedView.frame.width / 2
484496
}
485497

486498
private func updateLayoutCloseButton() {

Example/stork-controller/ModalTableViewController.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,21 @@ extension ModalTableViewController: UITableViewDelegate {
7979
}
8080
}
8181

82+
extension ModalTableViewController: SPStorkControllerConfirmDelegate {
83+
84+
var needConfirm: Bool {
85+
return true
86+
}
87+
88+
func confirm(_ completion: @escaping (Bool) -> ()) {
89+
print("confirm")
90+
let alertController = UIAlertController(title: "Need dismiss?", message: "It test confirm option for SPStorkController", preferredStyle: .actionSheet)
91+
alertController.addDestructiveAction(title: "Confirm", complection: {
92+
completion(true)
93+
})
94+
alertController.addCancelAction(title: "Cancel") {
95+
completion(false)
96+
}
97+
self.present(alertController)
98+
}
99+
}

Example/stork-controller/ModalViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ extension ModalViewController: SPStorkControllerConfirmDelegate {
4040

4141
func confirm(_ completion: @escaping (Bool) -> ()) {
4242
let alertController = UIAlertController(title: "Need dismiss?", message: "It test confirm option for SPStorkController", preferredStyle: .actionSheet)
43-
alertController.addAction(title: "Confirm", complection: {
43+
alertController.addDestructiveAction(title: "Confirm", complection: {
4444
completion(true)
4545
})
4646
alertController.addCancelAction(title: "Cancel") {

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,9 @@ For confirm closing by swipe, use `SPStorkControllerConfirmDelegate`. Implenet p
282282
```swift
283283
@objc public protocol SPStorkControllerConfirmDelegate: class {
284284

285-
@objc optional var needConfirm: Bool { get }
285+
var needConfirm: Bool { get }
286286

287-
@objc optional func confirm(_ completion: @escaping (_ isConfirmed: Bool)->())
287+
func confirm(_ completion: @escaping (_ isConfirmed: Bool)->())
288288
}
289289
```
290290

SPStorkController.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Pod::Spec.new do |s|
22

33
s.name = "SPStorkController"
4-
s.version = "1.7"
4+
s.version = "1.7.1"
55
s.summary = "Very similar to the controllers displayed in Apple Music, Podcasts and Mail Apple's applications."
66
s.homepage = "https://github.com/IvanVorobei/SPStorkController"
77
s.source = { :git => "https://github.com/IvanVorobei/SPStorkController.git", :tag => s.version }

Source/SPStorkController/Protocols/SPStorkControllerConfirmDelegate.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import UIKit
2323

2424
@objc public protocol SPStorkControllerConfirmDelegate: class {
2525

26-
@objc optional var needConfirm: Bool { get }
26+
var needConfirm: Bool { get }
2727

28-
@objc optional func confirm(_ completion: @escaping (_ isConfirmed: Bool)->())
28+
func confirm(_ completion: @escaping (_ isConfirmed: Bool)->())
2929
}

0 commit comments

Comments
 (0)