POPAnimation初体验

本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

POPAnimation 是 facebook 搞出来的一个框架,专门做动画的.

常言道,一个框架不好用就不是一个好框架, github 上16000+stars 可不是盖的,足见其受欢迎程度

POPAnimation 的使用方法和 CAAnimation极为相似,设置架构都和 CAAnimation 相似,如下图所示


POPAnimation的结构
  • POPAnimation是一个大的基类
  • POPPropertyAnimation 继承自POPAnimation
  • 但真正起作用的还是下面红色方框中的四个类
这四个类的使用方法基本相同,主要就有以下三步
  1. 初始化动画效果对象
  2. 为动画效果添加属性
  3. 将动画效果添加到目标对象上

这都是套路了,不多说
我就写了一个很简单的 demo, 太复杂的咱也不会,之前没有看过任何 demo, 和资料,只听说过有这么个东西,写起来还是坑太多啊.况且之前的 CAAnimation 也忘了个七七八八.

先看下效果图:
demo 效果

可以看到,这是个包含2个 tableView 的控制器
很多电商类的 APP 都实现了这种双 tableView的联动,但这不是今天的重点

  • 点击左边的 cell, 右边 tableView 变成一个 alpha 值为0.6的小正方形缩到屏幕的左上角,随后自动还原

  • 点击右边的 cell, 左边的 tableView 直接缩到左下角,点击屏幕还原.

关键代码如下
 >  // -------- 弹簧动画 --------
 >/* 初始化弹簧动画效果对象 */

POPSpringAnimation *animation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];

 >/* 设置动画效果的属性 */
>animation.springSpeed = 20;
>animation.springBounciness = 20;
>animation.toValue = [NSValue >valueWithCGRect:self.leftTableViewRect];

 >/* 将动画添加到需要呈现的对象上,理论上可以是任何对象 */

[self.leftTableView pop_addAnimation:animation >forKey:@"sizeLarge"];

    >// -------- 基本动画 --------
>  - 初始化动画效果对象
  >  - 为动画效果对象设置属性
  >  - 将动画效果添加到对象身上

>POPBasicAnimation *basicAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];
basicAnimation.fromValue = @0;
basicAnimation.toValue = @1;
basicAnimation.duration = 2;
[self.leftTableView pop_addAnimation:basicAnimation forKey:@"alphaChange"];
完整代码如下:

#import "ViewController.h"
#import <pop/POP.h>

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource,POPAnimationDelegate>
@property (weak, nonatomic) IBOutlet UITableView *leftTableView;
@property (weak, nonatomic) IBOutlet UITableView *rightTableView;
/* 记录左边 tableView 的 Rect 值 */
@property (nonatomic,assign) CGRect leftTableViewRect;

/* 记录右边 tableView 的 Rect 值 */
@property (nonatomic,assign)CGRect rightTableViewRect;

@end

@implementation ViewController

#pragma mark *** 视图的生命周期 ***
- (void)viewDidLoad {
    [super viewDidLoad];
    self.leftTableView.dataSource = self;
    self.rightTableView.dataSource =self;
    self.leftTableView.delegate = self;
    self.rightTableView.delegate =self;
    [self setupUI];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
        // -------- 在 viewDidAppear 中存储控件的 frame 值才能获得真正的正确的 frame 值 --------
    self.leftTableViewRect = self.leftTableView.frame;
    self.rightTableViewRect = self.rightTableView.frame;
}

    // -------- 在 dealloc 方法中移除所有动画 --------
-(void)dealloc
{
    [self pop_removeAllAnimations];
}

#pragma mark *** 设置 UI ***
- (void)setupUI
{
    UIImage *image = [UIImage imageNamed:@"01"];
    self.view.layer.contents = (__bridge id _Nullable)(image.CGImage);
}

#pragma mark *** 点击屏幕触发的方法 ***
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
        // -------- 弹簧动画 --------
    
     /* 初始化弹簧动画效果对象 */
    POPSpringAnimation *animation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
    
     /* 设置动画效果的属性 */
    animation.springSpeed = 20;
    animation.springBounciness = 20;
    animation.toValue = [NSValue valueWithCGRect:self.leftTableViewRect];
    
     /* 将动画添加到需要呈现的对象上,理论上可以是任何对象 */
    [self.leftTableView pop_addAnimation:animation forKey:@"sizeLarge"];
    
    
        // -------- 基本动画 --------
    
     /* 同样是这三步
      * 1. 初始化动画效果对象
      * 2. 为动画效果对象设置属性
      * 3. 将动画效果添加到对象身上
      */
    
    POPBasicAnimation *basicAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];
    basicAnimation.fromValue = @0;
    basicAnimation.toValue = @1;
    basicAnimation.duration = 2;
    [self.leftTableView pop_addAnimation:basicAnimation forKey:@"alphaChange"];
}

#pragma mark *** tableView 的数据源方法 ***

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([tableView isEqual:self.leftTableView]) {
        UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"leftCell"];
        cell.backgroundColor = [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1];
        
        return cell;
    }else
    {
        UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"rightCell"];
        cell.backgroundColor = [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1];
        
        return cell;
    }
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if ([tableView isEqual:self.leftTableView]) {
        return 5;
    }else
    {
        return 10;
    }
}

#pragma mark *** tableView 的代理方法 ***
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([tableView isEqual:self.rightTableView]) {
        POPSpringAnimation *animation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewFrame];
        animation.springSpeed = 20;
        animation.springBounciness = 20;
        animation.toValue = [NSValue valueWithCGRect:CGRectMake(0, [UIScreen mainScreen].bounds.size.height - 1, 1, 1)];
        [self.leftTableView pop_addAnimation:animation forKey:@"sizeSmall"];
        
    }else
    {
        POPBasicAnimation *basicAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];
        basicAnimation.fromValue = @0;
        basicAnimation.toValue = @0.6;
        basicAnimation.duration = 1;
        [self.rightTableView pop_addAnimation:basicAnimation forKey:@"alphaChange"];
        
        POPSpringAnimation *animation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewFrame];
        
        animation.springSpeed = 20;
        animation.springBounciness = 20;
        animation.toValue = [NSValue valueWithCGRect:CGRectMake([UIScreen mainScreen].bounds.size.width - 100,0,100,100)];
        [self.rightTableView pop_addAnimation:animation forKey:@"hidden"];
        
        animation.delegate = self;
    }
}
#pragma mark *** POPAnimationDelegate POPAnimation的代理方法 ***
    // -------- 当动画停止时执行 --------
- (void)pop_animationDidStop:(POPAnimation *)anim finished:(BOOL)finished
{
    POPSpringAnimation *springAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewFrame];
    springAnimation.springSpeed = 20;
    springAnimation.springBounciness = 20;
    springAnimation.toValue = [NSValue valueWithCGRect:self.rightTableViewRect];
    [self.rightTableView pop_addAnimation:springAnimation forKey:@"appear"];
    
    POPBasicAnimation *basicAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];
    basicAnimation.fromValue = @0.6;
    basicAnimation.toValue = @1;
    basicAnimation.duration = 1;
    [self.rightTableView pop_addAnimation:basicAnimation forKey:@"alphaChange"];
}
@end

PS. 本人有若干成套学习视频, 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,387评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,845评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,091评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,308评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,662评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,795评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,008评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,466评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,687评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,181评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,531评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,177评论 3 239
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,126评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,862评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,734评论 2 274

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,322评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,004评论 5 13
  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 3,000评论 1 23
  • 显式动画 显式动画,它能够对一些属性做指定的自定义动画,或者创建非线性动画,比如沿着任意一条曲线移动。 属性动画 ...
    清风沐沐阅读 1,867评论 1 5
  • 本文转载自:http://www.cocoachina.com/ios/20150105/10812.html 为...
    idiot_lin阅读 1,197评论 0 1