From 9172ad4ae8b1ff734e2d66f60684939d3b74b324 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 7 Feb 2021 01:22:46 +0700 Subject: [PATCH 1/3] feat: supported left & right dismiss gesture --- Presentr/Presentr.swift | 2 ++ Presentr/PresentrController.swift | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Presentr/Presentr.swift b/Presentr/Presentr.swift index 0d892b4..8722396 100644 --- a/Presentr/Presentr.swift +++ b/Presentr/Presentr.swift @@ -25,6 +25,8 @@ public enum DismissSwipeDirection { case `default` case bottom case top + case left + case right } /// The action that should happen when the background is tapped. diff --git a/Presentr/PresentrController.swift b/Presentr/PresentrController.swift index 41960af..bd04414 100644 --- a/Presentr/PresentrController.swift +++ b/Presentr/PresentrController.swift @@ -418,9 +418,13 @@ extension PresentrController { presentedViewFrame = presentedViewController.view.frame presentedViewCenter = presentedViewController.view.center - let directionDown = gesture.translation(in: presentedViewController.view).y > 0 - if (shouldSwipeBottom && directionDown) || (shouldSwipeTop && !directionDown) { + if dismissOnSwipeDirection == .left || dismissOnSwipeDirection == .right { latestShouldDismiss = conformingPresentedController?.presentrShouldDismiss?(keyboardShowing: keyboardIsShowing) ?? true + } else { + let directionDown = gesture.translation(in: presentedViewController.view).y > 0 + if (shouldSwipeBottom && directionDown) || (shouldSwipeTop && !directionDown) { + latestShouldDismiss = conformingPresentedController?.presentrShouldDismiss?(keyboardShowing: keyboardIsShowing) ?? true + } } } else if gesture.state == .changed { swipeGestureChanged(gesture: gesture) @@ -433,6 +437,16 @@ extension PresentrController { func swipeGestureChanged(gesture: UIPanGestureRecognizer) { let amount = gesture.translation(in: presentedViewController.view) + + if dismissOnSwipeDirection == .left || dismissOnSwipeDirection == .right { + let swipeLimit: CGFloat = dismissOnSwipeDirection == .left ? -50 : 50 + presentedViewController.view.center = CGPoint(x: presentedViewCenter.x + amount.x, y: presentedViewCenter.y) + let dismiss = dismissOnSwipeDirection == .left ? (amount.x < swipeLimit) : (amount.x > swipeLimit) + if dismiss && latestShouldDismiss { + presentedViewIsBeingDissmissed = true + presentedViewController.dismiss(animated: dismissAnimated, completion: nil) + } + } if shouldSwipeTop && amount.y > 0 { return From d84cac3ca53a2696832f956296ca7588c76087bb Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 7 Feb 2021 01:30:10 +0700 Subject: [PATCH 2/3] chore: refactored codes --- Presentr/PresentrController.swift | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Presentr/PresentrController.swift b/Presentr/PresentrController.swift index bd04414..58e549d 100644 --- a/Presentr/PresentrController.swift +++ b/Presentr/PresentrController.swift @@ -446,25 +446,25 @@ extension PresentrController { presentedViewIsBeingDissmissed = true presentedViewController.dismiss(animated: dismissAnimated, completion: nil) } - } - - if shouldSwipeTop && amount.y > 0 { - return - } else if shouldSwipeBottom && amount.y < 0 { - return - } + } else { + if shouldSwipeTop && amount.y > 0 { + return + } else if shouldSwipeBottom && amount.y < 0 { + return + } - var swipeLimit: CGFloat = 100 - if shouldSwipeTop { - swipeLimit = -swipeLimit - } + var swipeLimit: CGFloat = 100 + if shouldSwipeTop { + swipeLimit = -swipeLimit + } - presentedViewController.view.center = CGPoint(x: presentedViewCenter.x, y: presentedViewCenter.y + amount.y) + presentedViewController.view.center = CGPoint(x: presentedViewCenter.x, y: presentedViewCenter.y + amount.y) - let dismiss = shouldSwipeTop ? (amount.y < swipeLimit) : ( amount.y > swipeLimit) - if dismiss && latestShouldDismiss { - presentedViewIsBeingDissmissed = true - presentedViewController.dismiss(animated: dismissAnimated, completion: nil) + let dismiss = shouldSwipeTop ? (amount.y < swipeLimit) : ( amount.y > swipeLimit) + if dismiss && latestShouldDismiss { + presentedViewIsBeingDissmissed = true + presentedViewController.dismiss(animated: dismissAnimated, completion: nil) + } } } From 3818e444afc9f361f404650fc1c7ceaa3347b03b Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 7 Feb 2021 01:34:40 +0700 Subject: [PATCH 3/3] chore: refactored codes --- Presentr/PresentrController.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Presentr/PresentrController.swift b/Presentr/PresentrController.swift index 58e549d..19cc15e 100644 --- a/Presentr/PresentrController.swift +++ b/Presentr/PresentrController.swift @@ -439,6 +439,11 @@ extension PresentrController { let amount = gesture.translation(in: presentedViewController.view) if dismissOnSwipeDirection == .left || dismissOnSwipeDirection == .right { + if dismissOnSwipeDirection == .left && amount.x > 0 { + return + } else if dismissOnSwipeDirection == .right && amount.x < 0 { + return + } let swipeLimit: CGFloat = dismissOnSwipeDirection == .left ? -50 : 50 presentedViewController.view.center = CGPoint(x: presentedViewCenter.x + amount.x, y: presentedViewCenter.y) let dismiss = dismissOnSwipeDirection == .left ? (amount.x < swipeLimit) : (amount.x > swipeLimit)