Skip to content

Instantly share code, notes, and snippets.

@ngutman
Last active January 3, 2016 15:38

Revisions

  1. ngutman revised this gist Jan 17, 2014. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions GGDraggableView.m
    Original file line number Diff line number Diff line change
    @@ -34,9 +34,9 @@ - (void)dragged:(UIPanGestureRecognizer *)gestureRecognizer

    - (void)updateOverlay:(CGFloat)distance
    {
    if ((distance > 0) && (self.overlayView.mode != GGOverlayViewModeRight)) {
    if (distance > 0) {
    self.overlayView.mode = GGOverlayViewModeRight;
    } else if ((distance < 0) && (self.overlayView.mode != GGOverlayViewModeLeft)) {
    } else if (distance <= 0) {
    self.overlayView.mode = GGOverlayViewModeLeft;
    }
    CGFloat overlayStrength = MIN(fabsf(distance) / 100, 0.4);
  2. ngutman created this gist Jan 17, 2014.
    54 changes: 54 additions & 0 deletions GGDraggableView.m
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,54 @@
    - (void)dragged:(UIPanGestureRecognizer *)gestureRecognizer
    {
    CGFloat xDistance = [gestureRecognizer translationInView:self].x;
    CGFloat yDistance = [gestureRecognizer translationInView:self].y;

    switch (gestureRecognizer.state) {
    case UIGestureRecognizerStateBegan:{
    self.originalPoint = self.center;
    break;
    };
    case UIGestureRecognizerStateChanged:{
    CGFloat rotationStrength = MIN(xDistance / 320, 1);
    CGFloat rotationAngel = (CGFloat) (2*M_PI/16 * rotationStrength);
    CGFloat scaleStrength = 1 - fabsf(rotationStrength) / 4;
    CGFloat scale = MAX(scaleStrength, 0.93);
    CGAffineTransform transform = CGAffineTransformMakeRotation(rotationAngel);
    CGAffineTransform scaleTransform = CGAffineTransformScale(transform, scale, scale);
    self.transform = scaleTransform;
    self.center = CGPointMake(self.originalPoint.x + xDistance, self.originalPoint.y + yDistance);

    [self updateOverlay:xDistance];

    break;
    };
    case UIGestureRecognizerStateEnded: {
    [self resetViewPositionAndTransformations];
    break;
    };
    case UIGestureRecognizerStatePossible:break;
    case UIGestureRecognizerStateCancelled:break;
    case UIGestureRecognizerStateFailed:break;
    }
    }

    - (void)updateOverlay:(CGFloat)distance
    {
    if ((distance > 0) && (self.overlayView.mode != GGOverlayViewModeRight)) {
    self.overlayView.mode = GGOverlayViewModeRight;
    } else if ((distance < 0) && (self.overlayView.mode != GGOverlayViewModeLeft)) {
    self.overlayView.mode = GGOverlayViewModeLeft;
    }
    CGFloat overlayStrength = MIN(fabsf(distance) / 100, 0.4);
    self.overlayView.alpha = overlayStrength;
    }

    - (void)resetViewPositionAndTransformations
    {
    [UIView animateWithDuration:0.2
    animations:^{
    self.center = self.originalPoint;
    self.transform = CGAffineTransformMakeRotation(0);
    self.overlayView.alpha = 0;
    }];
    }