// // AMPopTip+Animation.m // AMPopTip // // Created by Andrea Mazzini on 10/06/15. // Copyright (c) 2015 Fancy Pixel. All rights reserved. // #import "AMPopTip+Animation.h" #import @implementation AMPopTip (Animation) - (void)setShouldBounce:(BOOL)shouldBounce { objc_setAssociatedObject(self, @selector(shouldBounce), [NSNumber numberWithBool:shouldBounce], OBJC_ASSOCIATION_RETAIN);} - (BOOL)shouldBounce { return [objc_getAssociatedObject(self, @selector(shouldBounce)) boolValue]; } - (void)performActionAnimation { switch (self.actionAnimation) { case AMPopTipActionAnimationBounce: self.shouldBounce = YES; [self bounceAnimation]; break; case AMPopTipActionAnimationFloat: [self floatAnimation]; break; case AMPopTipActionAnimationPulse: [self pulseAnimation]; break; case AMPopTipActionAnimationNone: return; break; default: break; } } - (void)floatAnimation { CGFloat xOffset = 0; CGFloat yOffset = 0; switch (self.direction) { case AMPopTipDirectionUp: yOffset = -self.actionFloatOffset; break; case AMPopTipDirectionDown: yOffset = self.actionFloatOffset; break; case AMPopTipDirectionLeft: xOffset = -self.actionFloatOffset; break; case AMPopTipDirectionRight: xOffset = self.actionFloatOffset; break; case AMPopTipDirectionNone: yOffset = -self.actionFloatOffset; break; } [UIView animateWithDuration:(self.actionAnimationIn / 2) delay:self.actionDelayIn options:(UIViewAnimationOptionRepeat | UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction) animations:^{ self.transform = CGAffineTransformMakeTranslation(xOffset, yOffset); } completion:nil]; } - (void)bounceAnimation { CGFloat xOffset = 0; CGFloat yOffset = 0; switch (self.direction) { case AMPopTipDirectionUp: yOffset = -self.actionBounceOffset; break; case AMPopTipDirectionDown: yOffset = self.actionBounceOffset; break; case AMPopTipDirectionLeft: xOffset = -self.actionBounceOffset; break; case AMPopTipDirectionRight: xOffset = self.actionBounceOffset; break; case AMPopTipDirectionNone: yOffset = -self.actionBounceOffset; break; } [UIView animateWithDuration:(self.actionAnimationIn / 10) delay:self.actionDelayIn options:(UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionAllowUserInteraction) animations:^{ self.transform = CGAffineTransformMakeTranslation(xOffset, yOffset); } completion:^(BOOL finished) { [UIView animateWithDuration:(self.actionAnimationIn - self.actionAnimationIn / 10) delay:0 usingSpringWithDamping:0.4 initialSpringVelocity:1 options:0 animations:^{ self.transform = CGAffineTransformIdentity; } completion:^(BOOL done) { if (self.shouldBounce && done) { [self bounceAnimation]; } }]; }]; } - (void)pulseAnimation { [UIView animateWithDuration:(self.actionAnimationIn / 2) delay:self.actionDelayIn options:(UIViewAnimationOptionRepeat | UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction) animations:^{ self.transform = CGAffineTransformMakeScale(self.actionPulseOffset, self.actionPulseOffset); } completion:nil]; } - (void)dismissActionAnimation { self.shouldBounce = NO; [UIView animateWithDuration:(self.actionAnimationOut / 2) delay:self.actionDelayOut options:UIViewAnimationOptionBeginFromCurrentState animations:^{ self.transform = CGAffineTransformIdentity; } completion:^(BOOL finished) { [self.layer removeAllAnimations]; }]; } @end