使用CADisplayLink实现果冻效果动画(学习于Glow 技术团队)
来源:互联网 发布:软件项目管理培训 编辑:程序博客网 时间:2024/05/01 23:15
使用CADisplayLink实现果冻效果动画
CADisplayLink object is a timer object that allows your application to synchronize its drawing to the refresh rate of the display.
github
1.定义一个View
@interfaceJellyView()
@property (strong,nonatomic)CADisplayLink *displayLink;
@property (nonatomic)CGFloat from;
@property (nonatomic)CGFloat to;
@property (nonatomic)BOOL animating;
@property (strong,nonatomic)CADisplayLink *displayLink;
@property (nonatomic)CGFloat from;
@property (nonatomic)CGFloat to;
@property (nonatomic)BOOL animating;
@end
2.绘制View及移动路径
- (void)drawRect:(CGRect)rect {
CALayer *layer =self.layer.presentationLayer;
CGFloat progress =1;
if (!self.animating) {
progress = 1;
} else {
progress = 1 - (layer.position.y - self.to) / (self.from - self.to);
}
CGFloat height =CGRectGetHeight(rect);
CGFloat deltaHeight = height /2 * (0.5 -fabs(progress -0.5));
CGPoint topLeft =CGPointMake(0, deltaHeight);
CGPoint topRight =CGPointMake(CGRectGetWidth(rect), deltaHeight);
CGPoint bottomLeft =CGPointMake(0, height);
CGPoint bottomRight =CGPointMake(CGRectGetWidth(rect), height);
UIBezierPath* path = [UIBezierPathbezierPath];
[[UIColorblueColor]setFill];
[path moveToPoint:topLeft];
[path addQuadCurveToPoint:topRightcontrolPoint:CGPointMake(CGRectGetMidX(rect),0)];
[path addLineToPoint:bottomRight];
[path addQuadCurveToPoint:bottomLeftcontrolPoint:CGPointMake(CGRectGetMidX(rect), height - deltaHeight)];
[path closePath];
[path fill];
CALayer *layer =self.layer.presentationLayer;
CGFloat progress =1;
if (!self.animating) {
progress = 1;
} else {
progress = 1 - (layer.position.y - self.to) / (self.from - self.to);
}
CGFloat height =CGRectGetHeight(rect);
CGFloat deltaHeight = height /2 * (0.5 -fabs(progress -0.5));
CGPoint topLeft =CGPointMake(0, deltaHeight);
CGPoint topRight =CGPointMake(CGRectGetWidth(rect), deltaHeight);
CGPoint bottomLeft =CGPointMake(0, height);
CGPoint bottomRight =CGPointMake(CGRectGetWidth(rect), height);
UIBezierPath* path = [UIBezierPathbezierPath];
[[UIColorblueColor]setFill];
[path moveToPoint:topLeft];
[path addQuadCurveToPoint:topRightcontrolPoint:CGPointMake(CGRectGetMidX(rect),0)];
[path addLineToPoint:bottomRight];
[path addQuadCurveToPoint:bottomLeftcontrolPoint:CGPointMake(CGRectGetMidX(rect), height - deltaHeight)];
[path closePath];
[path fill];
}
3.添加CADisplayLink
- (void)startAnimationFrom:(CGFloat)from to:(CGFloat)to {
self.from = from;
self.to = to;
self.animating = YES;
if (self.displayLink == nil) {
self.displayLink = [CADisplayLinkdisplayLinkWithTarget:selfselector:@selector(tick:)];
[self.displayLinkaddToRunLoop:[NSRunLoopcurrentRunLoop]
forMode:NSDefaultRunLoopMode];
}
}
- (void)completeAnimation {
self.animating = NO;
[self.displayLinkinvalidate];
self.displayLink = nil;
}
- (void)tick:(CADisplayLink *)displayLink {
[selfsetNeedsDisplay];
self.from = from;
self.to = to;
self.animating = YES;
if (self.displayLink == nil) {
self.displayLink = [CADisplayLinkdisplayLinkWithTarget:selfselector:@selector(tick:)];
[self.displayLinkaddToRunLoop:[NSRunLoopcurrentRunLoop]
forMode:NSDefaultRunLoopMode];
}
}
- (void)completeAnimation {
self.animating = NO;
[self.displayLinkinvalidate];
self.displayLink = nil;
}
- (void)tick:(CADisplayLink *)displayLink {
[selfsetNeedsDisplay];
}
4.调用
CGFloat from = CGRectGetHeight(self.view.bounds) - CGRectGetHeight(self.blockView.bounds) / 2;
CGFloat to =100;
self.blockView.center = CGPointMake(self.blockView.center.x, from);
[self.blockViewstartAnimationFrom:fromto:to];
[UIViewanimateWithDuration:1delay:0usingSpringWithDamping:0.85initialSpringVelocity:0options:0animations:^{
self.blockView.center = CGPointMake(self.blockView.center.x, to);
} completion:^(BOOL finished) {
[UIViewanimateWithDuration:1delay:0usingSpringWithDamping:0.85initialSpringVelocity:0options:0animations:^{
self.blockView.center = CGPointMake(self.blockView.center.x, to);
} completion:^(BOOL finished) {
[self.blockViewcompleteAnimation];
}];
1 0
- 使用CADisplayLink实现果冻效果动画(学习于Glow 技术团队)
- 使用CADisplayLink实现果冻效果动画
- 粘性动画以及果冻效果的实现
- 果冻弹簧效果动画
- 自己手动实现 KVO(来源:Glow 技术团队博客)
- Glow 技术团队博客 --runtime
- 利用html5/css3 动画效果,实现图片果冻抖动效果
- GLSL实现Glow效果
- GLSL实现Glow效果
- GLSL实现Glow效果
- 谈谈iOS中粘性动画以及果冻效果的实现
- IOS粘性动画以及果冻效果的实现
- 谈谈iOS中粘性动画以及果冻效果的实现
- 谈谈iOS中粘性动画以及果冻效果的实现
- 谈谈iOS中粘性动画以及果冻效果的实现
- iOS开发:粘性动画以及果冻效果的实现
- iOS开发:粘性动画以及果冻效果的实现
- 粘性动画以及果冻效果
- shell (二)
- 给网页设计师和前端开发者看的前端性能优化
- 同步信号与异步信号的问题
- ACM--steps--dyx--1.2.4--Buildings
- 有关UNLIMITED TABLESPACE权限
- 使用CADisplayLink实现果冻效果动画(学习于Glow 技术团队)
- 对象数组内存图解
- 线程属性pthread_attr_t和多线程常用函数
- ABAP模块-取整操作中CEIL和FLOOR用法
- windows pentest经验
- 肤色检测&人脸检测数据集等链接大集合(持续更新中...)
- 设计一个Cache系统 【双向链表+哈希表】
- Java基础第九天案例--登陆注册案例(1)
- 转自kuangbin