iOS上手指点击波纹效果的实现

cp100 8年前
   <p>闲暇时间做了一个反馈手指点击屏幕的效果,用到了CAShapeLayer和基本的动画知识,模拟器上效果如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/71e4d9f7be1179aa95807197b85d4ef4.gif"></p>    <p style="text-align:center">fingerWave.gif</p>    <ul>     <li> <p>这种效果使用在某些页面上肯定会给用户更有趣的体验,特别是面向儿童的app中。</p> </li>    </ul>    <h2><strong>具体的实现代码如下</strong></h2>    <ul>     <li> <p>首先监听控制器view的Tap事件</p> <pre>  <code class="language-objectivec">UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap:)];    [self.view addGestureRecognizer:tap];</code></pre> <pre>  <code class="language-objectivec">- (void)onTap:(UITapGestureRecognizer*)sender {    CGPoint center = [sender locationInView:sender.view];    [FingerWaveView  showInView:self.view center:center];  }</code></pre> </li>     <li> <p>FingerWaveView.h</p> <pre>  <code class="language-objectivec">#import <UIKit/UIKit.h>  @interface FingerWaveView : UIView  + (instancetype)showInView:(UIView *)view center:(CGPoint)center;  @end</code></pre> </li>     <li> <p>FingerWaveView.m</p> <pre>  <code class="language-objectivec">#import "FingerWaveView.h"  @interface FingerWaveView () <CAAnimationDelegate>  {    CGSize waveSize;    NSTimeInterval duration;  }  @end  @implementation FingerWaveView  - (instancetype)initWithFrame:(CGRect)frame{    self=[super initWithFrame:frame];    if (self) {        waveSize = CGSizeMake(150, 150);        duration = 1.0;    }    return self;  }  + (instancetype)showInView:(UIView *)view center:(CGPoint)center {    FingerWaveView *waveView = [FingerWaveView new];    [waveView setframeWithCenter:center];    [view addSubview:waveView];    return waveView;  }  - (void)didMoveToSuperview{    CAShapeLayer *waveLayer = [CAShapeLayer new];    waveLayer.backgroundColor  = [UIColor clearColor].CGColor;    waveLayer.opacity = 0.6;    waveLayer.fillColor = [UIColor whiteColor].CGColor;    [self.layer addSublayer:waveLayer];      [self startAnimationInLayer:waveLayer];  }  - (void)startAnimationInLayer:(CALayer *)layer{    UIBezierPath *beginPath = [UIBezierPath bezierPathWithArcCenter:[self pathCenter] radius:[self animationBeginRadius] startAngle:0 endAngle:M_PI*2 clockwise:YES];    UIBezierPath *endPath = [UIBezierPath bezierPathWithArcCenter:[self pathCenter] radius:[self animationEndRadius] startAngle:0 endAngle:M_PI*2 clockwise:YES];      CABasicAnimation *rippleAnimation = [CABasicAnimation animationWithKeyPath:@"path"];    rippleAnimation.delegate = self;    rippleAnimation.fromValue = (__bridge id _Nullable)(beginPath.CGPath);    rippleAnimation.toValue = (__bridge id _Nullable)(endPath.CGPath);    rippleAnimation.duration = duration;      CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];    opacityAnimation.delegate = self;    opacityAnimation.fromValue = [NSNumber numberWithFloat:0.6];    opacityAnimation.toValue = [NSNumber numberWithFloat:0.0];    opacityAnimation.duration = duration;      [layer addAnimation:rippleAnimation forKey:@"rippleAnimation"];    [layer addAnimation:opacityAnimation forKey:@"opacityAnimation"];  }  - (void)setframeWithCenter:(CGPoint)center{    CGRect frame = CGRectMake(center.x-waveSize.width*0.5, center.y-waveSize.height*0.5, waveSize.width, waveSize.height);    self.frame = frame;;  }  - (CGFloat)animationBeginRadius{    return waveSize.width*0.5*0.2;  }  - (CGFloat)animationEndRadius{    return waveSize.width*0.5;  }  - (CGPoint)pathCenter{    return CGPointMake(waveSize.width*0.5, waveSize.height*0.5);  }  #pragma mark - CAAnimationDelegate  - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{    if (flag) {        [self removeFromSuperview];    }  }  @end</code></pre> </li>     <li> <p>大家也可以DIY我的代码,做出很多其他的效果,比如改成其他的波纹颜色。</p> </li>    </ul>    <p> </p>    <p>来自:http://www.jianshu.com/p/35e6f53ca0fe</p>    <p> </p>