Facebook POP 进阶指南

本文转自Kevin Blog
Facebook 在发布了 Paper 之后,似乎还不满足于只是将其作为一个概念性产品,更进一步开源了其背后的动画引擎 POP,此举大有三年前发布的 iOS UI 框架 Three20 的意味。而 POP 开源后也不负 Facebook 的厚望。



- POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
- anim.toValue = [NSValue valueWithCGPoint:CGPointMake(2.0, 2.0)];
- anim.springBounciness = 4.0;
- anim.springSpeed = 12.0;
- anim.completionBlock = ^(POPAnimation *anim, BOOL finished) {
- if (finished) {NSLog(@"Animation finished!");}};
- POPDecayAnimation *anim = [POPDecayAnimation animWithPropertyNamed:kPOPLayerPositionX];
- anim.velocity = @(100.0);
- anim.fromValue = @(25.0);
- //anim.deceleration = 0.998;
- anim.completionBlock = ^(POPAnimation *anim, BOOL finished) {
- if (finished) {NSLog(@"Stop!");}};

- POPBasicAnimation *anim = [POPBasicAnimation animation];
- anim.duration = 10.0;
- anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
- POPAnimatableProperty * prop = [POPAnimatableProperty propertyWithName:@"count" initializer:^(POPMutableAnimatableProperty *prop) { prop.readBlock = ^(id obj, CGFloat values[]) {
- values[0] = [[obj description] floatValue];};
- prop.writeBlock = ^(id obj, const CGFloat values[]) {
- [obj setText:[NSString stringWithFormat:@"%.2f",values[0]]];};
- prop.threshold = 0.01;}];
- anim.property = prop;
- anim.fromValue = @(0.0);
- anim.toValue = @(100.0);
- case UIGestureRecognizerStateChanged: {
- [self.popCircle.layer pop_removeAllAnimations];
- CGPoint translation = [pan translationInView:self.view];
- CGPoint center = self.popCircle.center;
- center.x += translation.x;
- center.y += translation.y;
- self.popCircle.center = center;
- [pan setTranslation:CGPointZero inView:self.popCircle];
- break;
- }
- case UIGestureRecognizerStateEnded:
- case UIGestureRecognizerStateCancelled: {
- CGPoint velocity = [pan velocityInView:self.view];
- [self addDecayPositionAnimationWithVelocity:velocity];
- break;
- }
- POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPosition];
- anim.velocity = [NSValue valueWithCGPoint:CGPointMake(velocity.x, velocity.y)];

- POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionY];
- anim.fromValue = @-200;
- anim.toValue = @(self.view.center.y);
- POPBasicAnimation *opacityAnim = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerOpacity];
- opacityAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
- opacityAnim.toValue = @1.0;
- POPBasicAnimation *rotationAnim = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerRotation];
- rotationAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
- rotationAnim.beginTime = CACurrentMediaTime() + 0.1;
- rotationAnim.toValue = @(0);

- CAShapeLayer *progressLayer = [CAShapeLayer layer];
- progressLayer.strokeColor = [UIColor colorWithWhite:1.0 alpha:0.98].CGColor;
- progressLayer.lineWidth = 26.0;
- UIBezierPath *progressline = [UIBezierPath bezierPath];
- [progressline moveToPoint:CGPointMake(25.0, 25.0)];
- [progressline addLineToPoint:CGPointMake(700.0, 25.0)];
- progressLayer.path = progressline.CGPath;
- POPSpringAnimation *scaleAnim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
- scaleAnim.toValue = [NSValue valueWithCGPoint:CGPointMake(0.3, 0.3)];
- POPSpringAnimation *boundsAnim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
- boundsAnim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 800, 50)];
- boundsAnim.completionBlock = ^(POPAnimation *anim, BOOL finished) {
- if (finished) {
- UIGraphicsBeginImageContextWithOptions(self.popCircle.frame.size, NO, 0.0);
- POPBasicAnimation *progressBoundsAnim = [POPBasicAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeEnd];
- progressBoundsAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
- progressBoundsAnim.toValue = @1.0;
- progressBoundsAnim.completionBlock = ^(POPAnimation *anim, BOOL finished) {if (finished) {UIGraphicsEndImageContext();}};
- [progressLayer pop_addAnimation:progressBoundsAnim forKey:@"AnimateBounds"];
- }
- };
Facebook POP 进阶指南的更多相关文章
- Facebook POP 使用指南
Facebook POP 使用指南 Pop是一个动画引擎,用以扩展iOS.OSX的动画类型.相较于iOS.OSX中的基本动画效果,Pop扩展后支持弹簧动画效果与衰减动画效果,你可以用Pop动画引擎来构 ...
- iOS开发Facebook POP动效库使用教程
如果说Origami这款动效原型工具是Facebook Paper的幕后功臣,那么POP便是Origami的地基.感谢Facebook开源了POP动效库,让人人都能制作出华丽的动效.我们只需5步,便能 ...
- Facebook POP动效库使用教程
编者注:用Origami作iOS动效的同学如果愁怎么实现,可以把这个给开发看看作为参考哦 如果说Origami这款动效原型工具是Facebook Paper的幕后功臣,那么POP便是Origami的地 ...
- HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)
HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...
- Weex入门与进阶指南
Weex入门与进阶指南 标签: WeexiOSNative 2016-07-08 18:22 59586人阅读 评论(8) 收藏 举报 本文章已收录于: iOS知识库 分类: iOS(87) 职 ...
- 【读书笔记】读《高性能网站建设指南》及《高性能网站建设进阶指南:Web开发者性能优化最佳实践》
这两本书就一块儿搞了,大多数已经理解,简单做个标记.主要对自己不太了解的地方,做一些记录. 一.读<高性能网站建设指南> 0> 黄金性能法则:只有10%~20%的最终用户响应时间 ...
- 走进 Facebook POP 的世界
POP: 一个流行的可扩展的动画引擎iOS,它支持spring和衰变动态动画,使其可用于构建现实,基于物理交互.Objective - C API允许快速集成, 对于所有的动画和过渡他是成熟的. 解释 ...
- HTML5游戏开发进阶指南
<HTML5游戏开发进阶指南> 基本信息 作者: (印)香卡(Shankar,A.R.) 译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121212260 上架时间:20 ...
- iOS进阶指南试读之UI篇
iOS进阶指南试读之UI篇 UI篇 UI是一个iOS开发工程师的基本功.怎么说?UI本质上就是你调用苹果提供给你的API来完成设计师的设计.所以,想提升UI的功力也很简单,没事就看看UIKit里的各个 ...
随机推荐
- 说说前端开发中的SEO
SEO(Search Engine Optimization),就是传说中的搜索引擎优化,是指为了增加网页在搜索引擎自然搜索结果中的收录数量以及提升排序位置而做的优化行为.我认为这是一门说来简单,但操 ...
- 19-10-15-Night-E
信心赛??高考赛…… 过程 T1码了暴力+随机化. T2没码完.$Kuku$了 T3写了暴力+ puts("86400\n-1"); 骗了点分. T1 ××你告诉我CF E题是T1 ...
- 深入浅出 Java Concurrency (6): 锁机制 part 1[转]
前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说明.从这一章开始花少量的篇幅谈谈锁机制. 上一个章节中谈到了锁机制,并且针对于原子操作谈了一些相关的概念和设 ...
- 【Redis安装】部署与基本配置 --基于Mac和Linux
Redis安装与部署[基于Mac和Linux] 一.Redis简介 基于内存的Key-Value高性能NoSQL数据库 二.Redis下载和解压 进入官网下载最新版的Redis,目前是5.0.0,这个 ...
- Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
WARN: SQL Error: , SQLState: HY000 八月 , :: 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logEx ...
- Activiti实战02_环境搭建
1:下载Activiti 访问:https://www.activiti.org/download-bpm 可以下载Activiti相关文档和历史版本压缩包,在 https://www.activit ...
- Junit5的依赖添加及RunWith(SpringJUnit4ClassRunner.class)注解使用
首先Junit5依赖应该配置为 <dependency> <groupId>org.junit.jupiter</groupId> <artifactId&g ...
- Redis源码解析:22sentinel(三)客观下线以及故障转移之选举领导节点
八:判断实例是否客观下线 当前哨兵一旦监测到某个主节点实例主观下线之后,就会向其他哨兵发送"is-master-down-by-addr"命令,询问其他哨兵是否也认为该主节点主观下 ...
- Liferay 7:Liferay DXP全套教程内附源码
分享是美德 都是英文教程,有不明白的问题可以随时咨询我. http://www.javasavvy.com/liferay-7-hooks-tutorials/
- Django项目:CRM(客户关系管理系统)--42--34PerfectCRM实现CRM自定义用户
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...