果冻效果
说明
参考源码 https://github.com/Resory/RYCuteView
效果
源码
https://github.com/YouXianMing/Animations
//
// SpringEffectController.m
// Animations
//
// Created by YouXianMing on 16/1/17.
// Copyright © 2016年 YouXianMing. All rights reserved.
//
#import "SpringEffectController.h"
#import "WxHxD.h"
#import "UIView+SetRect.h"
@interface SpringEffectController (){
CGPoint _centerPoint;
}
@property (nonatomic, strong) UIView *pointView;
@property (nonatomic, strong) CAShapeLayer *shapeLayer;
@property (nonatomic, strong) CADisplayLink *displayLink;
@end
@implementation SpringEffectController
- (void)setup {
[super setup];
_centerPoint = self.contentView.center;
self.shapeLayer = [CAShapeLayer layer];
self.shapeLayer.frame = self.contentView.bounds;
self.shapeLayer.fillColor = [UIColor redColor].CGColor;
self.shapeLayer.path = [self calculatePathWithPoint:CGPointMake(Width / 2.f, Height / 2.f)].CGPath;
[self.contentView.layer addSublayer:self.shapeLayer];
self.pointView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 4, 4)];
self.pointView.center = self.contentView.center;
[self.contentView addSubview:self.pointView];
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkEvent)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureEvent:)];
[self.contentView addGestureRecognizer:panGesture];
}
- (UIBezierPath *)calculatePathWithPoint:(CGPoint)point {
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(0, Height / 2.f)];
[path addLineToPoint:CGPointMake(0, Height)];
[path addLineToPoint:CGPointMake(Width, Height)];
[path addLineToPoint:CGPointMake(Width, Height / 2.f)];
[path addQuadCurveToPoint:CGPointMake(0, Height / 2.f)
controlPoint:point];
return path;
}
- (void)panGestureEvent:(UIPanGestureRecognizer *)panGesture {
CGPoint point = [panGesture locationInView:panGesture.view];
CGPoint calculatePoint = CGPointMake((point.x + _centerPoint.x) / 2.f, (point.y + _centerPoint.y) / 2.f);
if (panGesture.state == UIGestureRecognizerStateChanged) {
self.shapeLayer.path = [self calculatePathWithPoint:calculatePoint].CGPath;
self.pointView.center = calculatePoint;
} else if (panGesture.state == UIGestureRecognizerStateCancelled ||
panGesture.state == UIGestureRecognizerStateEnded ||
panGesture.state == UIGestureRecognizerStateFailed) {
[UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.25f initialSpringVelocity:0
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
self.pointView.center = self.contentView.center;
} completion:nil];
}
}
- (void)displayLinkEvent {
CALayer *layer = self.pointView.layer.presentationLayer;
self.shapeLayer.path = [self calculatePathWithPoint:layer.position].CGPath;
}
@end