From c39c1ec0c4c5c55686dde0fd9e8ba87c4934c6b9 Mon Sep 17 00:00:00 2001 From: Simon CORSIN Date: Tue, 15 Jul 2014 19:24:47 -0700 Subject: [PATCH] Added the support for vertical swipe direction. --- MDCSwipeToChoose/Public/Options/MDCSwipeOptions.h | 7 +++++++ MDCSwipeToChoose/Public/Options/MDCSwipeOptions.m | 1 + MDCSwipeToChoose/Public/State/MDCSwipeDirection.h | 8 +++++--- .../Public/Views/UIView+MDCSwipeToChoose.m | 14 ++++++++++++-- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/MDCSwipeToChoose/Public/Options/MDCSwipeOptions.h b/MDCSwipeToChoose/Public/Options/MDCSwipeOptions.h index 560a5ec..352582f 100644 --- a/MDCSwipeToChoose/Public/Options/MDCSwipeOptions.h +++ b/MDCSwipeToChoose/Public/Options/MDCSwipeOptions.h @@ -23,6 +23,7 @@ // #import +#import "MDCSwipeDirection.h" @class MDCPanState; @class MDCSwipeResult; @@ -81,6 +82,12 @@ typedef void (^MDCSwipeToChooseOnChosenBlock)(MDCSwipeResult *state); */ @property (nonatomic, assign) CGFloat rotationFactor; +/*! + * Contains the directions on which the swipe will be recognized + * Must be set using a OR operator (like MDCSwipeDirectionUp | MDCSwipeDirectionDown) + */ +@property (nonatomic, assign) MDCSwipeDirection allowedSwipeDirections; + /*! * A callback to be executed when the view is panned. The block takes an instance of * `MDCPanState` as an argument. Use this `state` instance to determine the pan direction diff --git a/MDCSwipeToChoose/Public/Options/MDCSwipeOptions.m b/MDCSwipeToChoose/Public/Options/MDCSwipeOptions.m index cd0103f..0bda97b 100644 --- a/MDCSwipeToChoose/Public/Options/MDCSwipeOptions.m +++ b/MDCSwipeToChoose/Public/Options/MDCSwipeOptions.m @@ -37,6 +37,7 @@ - (instancetype)init { _swipeCancelledAnimationOptions = UIViewAnimationOptionCurveEaseOut; _swipeAnimationDuration = 0.1; _swipeAnimationOptions = UIViewAnimationOptionCurveEaseIn; + _allowedSwipeDirections = MDCSwipeDirectionLeft | MDCSwipeDirectionRight; _rotationFactor = 3.f; _onChosen = [[self class] exitScreenOnChosenWithDuration:0.1 diff --git a/MDCSwipeToChoose/Public/State/MDCSwipeDirection.h b/MDCSwipeToChoose/Public/State/MDCSwipeDirection.h index 558fa0b..5259cc8 100644 --- a/MDCSwipeToChoose/Public/State/MDCSwipeDirection.h +++ b/MDCSwipeToChoose/Public/State/MDCSwipeDirection.h @@ -30,7 +30,9 @@ * and a swipe to the right as positive. */ typedef NS_ENUM(NSInteger, MDCSwipeDirection) { - MDCSwipeDirectionNone = 0, - MDCSwipeDirectionLeft, - MDCSwipeDirectionRight + MDCSwipeDirectionNone = 1, + MDCSwipeDirectionLeft = 2, + MDCSwipeDirectionRight = 4, + MDCSwipeDirectionUp = 8, + MDCSwipeDirectionDown = 16 }; diff --git a/MDCSwipeToChoose/Public/Views/UIView+MDCSwipeToChoose.m b/MDCSwipeToChoose/Public/Views/UIView+MDCSwipeToChoose.m index a9ea1d5..532ee15 100644 --- a/MDCSwipeToChoose/Public/Views/UIView+MDCSwipeToChoose.m +++ b/MDCSwipeToChoose/Public/Views/UIView+MDCSwipeToChoose.m @@ -28,6 +28,8 @@ #import "MDCGeometry.h" #import +#define HAS_OPT(options, opt) ((options & opt) == opt) + const void * const MDCSwipeOptionsKey = &MDCSwipeOptionsKey; const void * const MDCViewStateKey = &MDCViewStateKey; @@ -114,6 +116,8 @@ - (void)mdc_setupPanGestureRecognizer { - (void)mdc_finalizePosition { MDCSwipeDirection direction = [self mdc_directionOfExceededThreshold]; switch (direction) { + case MDCSwipeDirectionUp: + case MDCSwipeDirectionDown: case MDCSwipeDirectionRight: case MDCSwipeDirectionLeft: { CGPoint translation = MDCCGPointSubtract(self.center, @@ -213,10 +217,16 @@ - (CGPoint)mdc_translationExceedingThreshold:(CGFloat)threshold } - (MDCSwipeDirection)mdc_directionOfExceededThreshold { - if (self.center.x > self.mdc_viewState.originalCenter.x + self.mdc_options.threshold) { + MDCSwipeDirection directions = [self mdc_options].allowedSwipeDirections; + + if (HAS_OPT(directions, MDCSwipeDirectionRight) && self.center.x > self.mdc_viewState.originalCenter.x + self.mdc_options.threshold) { return MDCSwipeDirectionRight; - } else if (self.center.x < self.mdc_viewState.originalCenter.x - self.mdc_options.threshold) { + } else if (HAS_OPT(directions, MDCSwipeDirectionLeft) && self.center.x < self.mdc_viewState.originalCenter.x - self.mdc_options.threshold) { return MDCSwipeDirectionLeft; + } else if (HAS_OPT(directions, MDCSwipeDirectionUp) && self.center.y < self.mdc_viewState.originalCenter.y - self.mdc_options.threshold) { + return MDCSwipeDirectionUp; + } else if (HAS_OPT(directions, MDCSwipeDirectionDown) && self.center.y > self.mdc_viewState.originalCenter.y + self.mdc_options.threshold) { + return MDCSwipeDirectionDown; } else { return MDCSwipeDirectionNone; }