Facebook_Pop的使用指北

2023-05-16

背景

  • 最近公司有了一个创新项目,就是在视频视图之上添加一层视图,视图设计涉及到了复杂的控件动画,会根据视频的播放,显示一些控件,控件有位移、缩放、旋转、shake等动画。
  • 在网上调研了一下,对比了苹果的CoreAnimation,觉得Facebook_Pop使用起来更加简单一些,并且有很多优点。
  • 在使用中,遇到了一个bug,Pop的kPOPLayerRotationY存在Bug,大于90度就会出错。

pop bug

Pop介绍

pop

  • Pop的Github

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

  • POP背后的开发者是 Kimon Tsinteris, Push Pop Press 的联合创始人,曾经在Apple担任高级工程师,并参与了 iPhone 和 iPad 上软件的研发(iPhone的指南针以及地图)。2011年的时候 Facebook 收购了他的公司,此后他便加入了 Facebook 负责 Facebook iOS 版本的开发。

  • 如果你打开 Push Pop Press 开发的 AI Gore 这款 App,你会发现交互和动画与Paper几乎如出一辙。对,他们都是 Kimon Tsinteris 开发的。

  • 不满于 Apple 自身动画框架的单调,Push Pop Press 致力于创造一个逼真的、充满物理效应的体验。 POP 就是这个理念下最新一代的成果。

  • POP 使用 Objective-C++ 编写,Objective-C++ 是对 C++ 的扩展,就像 Objective-C 是 C 的扩展。而至于为什么他们用 Objective-C++ 而不是纯粹的 Objective-C,原因是他们更喜欢 Objective-C++ 的语法特性所提供的便利。

继承关系

WX20210804-160255@2x.png

POPAnimation

  • 属性
// 动画名称
@property (copy, nonatomic) NSString *name;
// 开始时间,默认立即开始
@property (assign, nonatomic) CFTimeInterval beginTime;

// 代理
@property (weak, nonatomic) id delegate;

// 事件追踪
@property (readonly, nonatomic) POPAnimationTracer *tracer;

// 开始的block
@property (copy, nonatomic) void (^animationDidStartBlock)(POPAnimation *anim);

// 动画触发toValue值的block
@property (copy, nonatomic) void (^animationDidReachToValueBlock)(POPAnimation *anim);

// 动画完成的回调
@property (copy, nonatomic) void (^completionBlock)(POPAnimation *anim, BOOL finished);

// 动画每一帧的回调
@property (copy, nonatomic) void (^animationDidApplyBlock)(POPAnimation *anim);

// 动画是否在结束后移除,默认为YES
@property (assign, nonatomic) BOOL removedOnCompletion;

// 暂停
@property (assign, nonatomic, getter = isPaused) BOOL paused;

// 动画是否返回原来的状态,以动画形式返回
@property (assign, nonatomic) BOOL autoreverses;

// 重复次数
@property (assign, nonatomic) NSInteger repeatCount;

// 是都永远重复
@property (assign, nonatomic) BOOL repeatForever;

POPPropertyAnimation

  • 属性
// 动画的属性,我们可以借助此属性,做一些自定义
@property (strong, nonatomic) POPAnimatableProperty *property;

// 动画开始的值
@property (copy, nonatomic) id fromValue;

// 动画结束的值
@property (copy, nonatomic) id toValue;

// 动画的细腻度,设置很大的值会有bug 【0,1】
@property (assign, nonatomic) CGFloat roundingFactor;

// 没理解
@property (assign, nonatomic) NSUInteger clampMode;

// 没理解
@property (assign, nonatomic, getter = isAdditive) BOOL additive;

POPBaseAnimation

  • 初始化方法,一般使用下面的初始化方法
+ (instancetype)animationWithPropertyNamed:(NSString *)name;
  • 动画方式属性:timingFunction
// 线性的
kCAMediaTimingFunctionLinear
// 慢->快
kCAMediaTimingFunctionEaseIn
// 快->慢
kCAMediaTimingFunctionEaseOut
// 慢->快->慢
kCAMediaTimingFunctionEaseInEaseOut
  • 动画时长:duration

  • 例子1:简单的位移

POPBasicAnimation *baseAnim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];
baseAnim.completionBlock = ^(POPAnimation *anim, BOOL finished) {
    NSLog(@"动画完成”);
};

baseAnim.duration = 0.5;
baseAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
baseAnim.fromValue = @(self.demoView.center);
baseAnim.toValue = @(self.view.center);
[self.demoView pop_addAnimation:baseAnim forKey:@"baseAnim”];
  • 效果图1
    效果1

  • 例子2:倒计时

POPAnimatableProperty *prop = [POPAnimatableProperty propertyWithName:@"countdown" initializer:^(POPMutableAnimatableProperty *prop) {
    prop.writeBlock = ^(id obj, const CGFloat *values) {
        NSLog(@"%d", (int)values[0]);
        int value = (int)values[0];
        NSString *timeStr = [NSString stringWithFormat:@"%02d:%02d:%02d", value/60, value%60,(int)(values[0]*100)%100];
        self.label.text = timeStr;
    };
}];

POPBasicAnimation *anBasic = [POPBasicAnimation linearAnimation];   //秒表当然必须是线性的时间函数
anBasic.property = prop;    //自定义属性
anBasic.fromValue = @(1*60);   //从0开始
anBasic.toValue = @(0);  //180秒
anBasic.duration = 3*60;    //持续3分钟
anBasic.beginTime = CACurrentMediaTime();    //延迟1秒开始
[self.label pop_addAnimation:anBasic forKey:@"countdown”];
  • 效果图2
    效果图2

POPSpringAnimation

  • 构造方法
+ (instancetype)animationWithPropertyNamed:(NSString *)name;
  • 属性
// 初始速度
@property (copy, nonatomic) id velocity;

// 弹力 [0,20],默认为4
@property (assign, nonatomic) CGFloat springBounciness;

// 弹簧速度 [0,20],默认为12
@property (assign, nonatomic) CGFloat springSpeed;

// 拉力,张力
@property (assign, nonatomic) CGFloat dynamicsTension;

// 摩擦力
@property (assign, nonatomic) CGFloat dynamicsFriction;

// 质量
@property (assign, nonatomic) CGFloat dynamicsMass;
  • 例子3:弹性移动
POPSpringAnimation *anSpr = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];
anSpr.completionBlock = ^(POPAnimation *anim, BOOL finished) {
    NSLog(@"动画完成”);
};
anSpr.springSpeed = 100;
anSpr.springBounciness = 20.0;
anSpr.fromValue = @(self.demoView.center);
anSpr.toValue = @(self.view.center);
[self.demoView pop_addAnimation:anSpr forKey:@"anSpr”];
  • 效果图3
    效果图3

POPDecayAnimation

  • Decay Animation 就是 POP 提供的另外一个非常特别的动画,他实现了一个衰减的效果。这个动画有一个重要的参数 velocity(速率),一般并不用于物体的自发动画,而是与用户的交互共生。这个和 iOS7 引入的 UIDynamic 非常相似,如果你想实现一些物理效果,这个也是非常不错的选择。

  • Decay 的动画没有 toValue 只有 fromValue,然后按照 velocity 来做衰减操作。

-例子4:衰减转动

- (void)jumpAnimation {
    
    [self.demoView.layer pop_removeAllAnimations];
    POPDecayAnimation *anRotaion=[POPDecayAnimation animation];
    anRotaion.property = [POPAnimatableProperty propertyWithName:kPOPLayerRotation];
    
    if (self.animated) {
        anRotaion.velocity = @(-150);
    }else{
        anRotaion.velocity = @(150);
        anRotaion.fromValue =  @(25.0);
    }
    
    self.animated = !self.animated;
    
    anRotaion.completionBlock = ^(POPAnimation *anim, BOOL finished) {
        if (finished) {
            [self jumpAnimation];
        }
    };
    
    [self.demoView.layer pop_addAnimation:anRotaion forKey:@"myRotationView”];
}
  • 效果图4
    效果图4

值得关注的 POP 周边

  • POP-HandApp 这就是本文的示例App,包含了大量动画的操作方法和上述介绍的实例。

  • AGGeometryKit-POP 通过 POP 对图片进行变形操作,非常酷。

  • POP-MCAnimate POP 的一个封装,可以让你更方便的使用 POP。

  • Rebound POP 的 Android 部分实现,主要是 Spring 的效果,移植自 Facebook 的rebound-js。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Facebook_Pop的使用指北 的相关文章

随机推荐

  • 使用platform框架实现led流水灯和按键中断开启风扇

    需求 xff1a 使用platform框架实现led流水灯和按键中断开启风扇 实现过程 xff1a 设备树文件 xff1a dts v1 include 34 stm32mp157 dtsi 34 include 34 stm32mp15x
  • Centos7安装Redis

    今天和大家分享如何在Centos7上部署Redis数据库 xff0c 感兴趣的小伙伴可收藏 目录 一 准备工作 二 搭建服务器 三 部署Redis 3 1 远程登录我们的服务器 3 2 配置Redis 3 3 测试Redis 3 4 服务器
  • 详细介绍云服务器购买并使用

    由于原先的服务器块过期了 xff0c 所以今天和大家分享一下如何从头开始购买云服务器并使用 目录 一 详细步骤 1 选择服务器 xff1a 2 购买服务器 xff1a 3 配置服务器操作系统 4 进入控制台 5 管理服务器 6 登录系统实例
  • SDN初学者之路

    今天重新开始拿起SDN完成我的关于SDN控制器下关于交换机迁移的负载均衡问题研究 以此对于SDN 43 RYU 43 多控制器 43 交换机迁移 43 负载均衡相关进行整理记录 其中 xff0c 主要研究内容是交换机迁移过程中的路径最优化选
  • 腾讯云短信服务(详细教程-Django框架、API接口)实现

    今天和大家分享如何实现短信服务 xff0c 以腾讯云服务为例 目录 一 准备工作 二 短信服务接口开发 2 1 服务配置 2 2接口开发 三 测试短信服务 四 结束语 一 准备工作 腾讯云短信服务会发放免费的个人认证短信和赠送短信总共200
  • Pytest测试框架基础篇

    今天和大家分享一下pytest测试框架的基础篇 xff0c 内容包括 xff1a 了解pytest测试框架的特点 掌握pytest基本使用 掌握pytest常用的场景 掌握pytest运行参数和配置方法 目录 一 测试框架的作用和类型 1
  • Pytest测试框架进阶篇

    今天和大家分享pytest测试框架进阶篇 xff0c 也可以称之为pytest测试框架核心 xff0c 主要核心有 xff1a 掌握pytest fixture 掌握pytest mark 目录 一 掌握pytest fixture 1 1
  • PowerDesigner--快速创建表模型生成SQL语句

    今天和大家分享一个我常用的设计表模型的工具PowserDesigner 选择物理模型 创建表 字段 索引等 梳理表之间的关系 一键生成SQL语句 目录 一 准备工作 二 选择物理模型 三 创建表 字段等 3 1 创建表 3 2 创建字段 3
  • python读取txt文件内容并进行分析

    今天和大家分享一下python如何读取txt文件内容并进行数据分析的 需求 某txt文件中存在很多数据 这些数据的某一个属性主要分为A B C D四类 xff0c 要求把数据分成四类求某一数值属性的平均值 xff0c 并统计生成超过平均值两
  • python脚本控制服务器---paramiko的使用

    今天和大家分享一个第三方库paramiko xff0c 主要应用场景是在实现自动化操作服务器时使用 xff0c 模拟我们手动登录服务器 输入cmd命令等操作 最后封装成自己的工具 xff0c 方便后面调用 目录 一 安装paramiko 二
  • Vim编辑器常用快捷方式

    这几天在学习shell编程 xff0c 其中常常会用到Linux下的vim编译器 xff0c 今天就总结一些在vim编辑器中常用的快捷键 xff0c 方便我们更好的使用 目录 一 vi编辑器基本概念 二 模式切换 三 编辑模式 四 命令行模
  • Linux面试相关知识点看着一文就够了

    今天和大家分享一下linux操作系统下主要用到的几个知识点 xff0c 分别是 xff1a linux目录结构 linux常用命令 文件权限操作 服务操作 yum安装命令 docker服务 vim编译器 pymysql测试连接 用户及组命令
  • Python对象比较及深浅拷贝

    今天和大家分享一个python语言中特别重要的一个知识点 xff0c 比较及拷贝 目录 一 61 61 和 is 二 深浅拷贝 2 1 浅拷贝 2 2 深拷贝 三 总结 一 61 61 和 is 等于 61 61 和is是Python中对象
  • python中的值传递和引用传递

    今天和大家分享python中很重要的一个知识点 xff1a 参数传递 xff0c 其中包括值传递和引用传递 目录 一 为什么要熟悉值传递和引用传递 1 1 值传递 1 2 引用传递 二 Python变量及其赋值 三 Python函数的参数传
  • MySQL8.0下DATE,DATETIME和TIMESTAMP的自动初始化和更新

    MySQL8 0下DATE DATETIME和TIMESTAMP的自动初始化和更新 DATE日期类型DATETIME和TIMESTAMP的不同什么是时区自动变动 xff1f DATETIME和TIMESTAMP的相同点微秒小数部分自动初始化
  • Python爬虫实战分析

    今天看到特别好的一篇文章 xff0c 分享给大家 从头到尾看了一遍 xff0c 以实战的例子分析爬虫所需要用到的知识点 十分受益 真可谓 xff1a python万能模板 xff0c 有了这个模板 xff0c 想爬取什么内容 xff0c 根
  • ansible dns

    1 详细叙述ansible的工作原理 工作原理 xff1a ansible是基于Python开发 xff0c 集合众多运维工具的优势 xff0c 实现批量的部署操作 xff0c ansible是基于模块化 xff0c 本身并没有部署能力 x
  • pip 安装命令 及 配置Path路径

    pip 不是内部或外部命令 也不是可运行的程序 或批处理文件 pip 安装命令 及 配置环境变量 numpy 输入pip install numpy 时 xff0c 提示 以numpy 为例 pip 不是内部或外部命令 也不是可运行的程序
  • 1-python工厂模式

    文章目录 工厂模式定义 xff1a 它的优点 xff1a 可以有如下三种实现方式1 简单工厂模式2 工厂方法模式3 抽象工厂模式总结 工厂模式定义 xff1a 在面向对象编程中 xff0c 术语 工厂 表示一个负责创建替他类型对象的类 通常
  • Facebook_Pop的使用指北

    背景 最近公司有了一个创新项目 xff0c 就是在视频视图之上添加一层视图 xff0c 视图设计涉及到了复杂的控件动画 xff0c 会根据视频的播放 xff0c 显示一些控件 xff0c 控件有位移 缩放 旋转 shake等动画 在网上调研