POP動畫[1]


POP動畫[1]

pop動畫是facebook擴展CoreAnimation的,使用及其方便:)

 

1:Spring系列的彈簧效果(兩個動畫kPOPLayerBounds與kPOPLayerCornerRadius同時運行)

#import "RootViewController.h"
#import "YXEasing.h"
#import "POP.h"
#import "YXGCD.h"

@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 初始化View
    UIView *showView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    showView.center  = self.view.center;
    showView.layer.cornerRadius = 25;
    showView.backgroundColor = [UIColor cyanColor];
    [self.view addSubview:showView];
    
    // 延時7s后執行的代碼
    [[GCDQueue mainQueue] execute:^{
        
        // 尺寸
        POPSpringAnimation *bounds = \
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
        
        // 圓角
        POPSpringAnimation *cornerRadius = \
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerCornerRadius];
        
        bounds.toValue     = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
        bounds.springSpeed = 0;
        
        cornerRadius.toValue     = @(100);
        cornerRadius.springSpeed = 0;
        
        // 添加動畫
        [showView.layer pop_addAnimation:bounds
                                  forKey:@"size"];
        [showView.layer pop_addAnimation:cornerRadius
                                  forKey:@"cornerRadius"];
        
    } afterDelay:NSEC_PER_SEC * 7];
}

@end

 

2:一個動畫結束后開始另外一個動畫

//
//  RootViewController.m
//  Animation
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import "YXEasing.h"
#import "POP.h"
#import "YXGCD.h"

@interface RootViewController ()<POPAnimationDelegate>

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 初始化View
    UIView *showView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    showView.center  = self.view.center;
    showView.layer.cornerRadius = 25;
    showView.backgroundColor = [UIColor cyanColor];
    [self.view addSubview:showView];
    
    // 延時7s后執行的代碼
    [[GCDQueue mainQueue] execute:^{
        
        // 位置
        POPSpringAnimation *position = \
            [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPosition];

        // 設置速度
        position.springSpeed = 0.f;
        
        // 賦值
        position.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 200)];

        // 添加動畫
        [showView.layer pop_addAnimation:position forKey:nil];
        
        // 結束后
        [position setCompletionBlock:^(POPAnimation *animation, BOOL finished) {
            // 顏色
            POPSpringAnimation *backgroundColor = \
                [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBackgroundColor];
            
            // 速度
            backgroundColor.springSpeed = 0.f;
            
            // 賦值
            backgroundColor.toValue = (id)[UIColor redColor].CGColor;
            
            // 添加動畫
            [showView.layer pop_addAnimation:backgroundColor forKey:nil];
        }];
    } afterDelay:NSEC_PER_SEC * 7];
}

@end

注意動畫類型的不同導致toValue的值也不一樣,這個始於CALayer的動畫保持一致的:

 

3:動畫中的代理

//
//  RootViewController.m
//  Animation
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import "YXEasing.h"
#import "POP.h"
#import "YXGCD.h"

@interface RootViewController ()<POPAnimationDelegate>

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 初始化View
    UIView *showView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    showView.center  = self.view.center;
    showView.layer.cornerRadius = 25;
    showView.backgroundColor = [UIColor cyanColor];
    [self.view addSubview:showView];
    
    // 延時7s后執行的代碼
    [[GCDQueue mainQueue] execute:^{
        
        // 尺寸
        POPSpringAnimation *bounds = \
            [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
        
        // 設置代理
        bounds.delegate = self;
        
        bounds.toValue     = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
        bounds.springSpeed = 0;
        
        // 添加動畫
        [showView.layer pop_addAnimation:bounds
                                  forKey:@"size"];
        
    } afterDelay:NSEC_PER_SEC * 7];
}

// 動畫開始
- (void)pop_animationDidStart:(POPAnimation *)anim
{
    NSLog(@"pop_animationDidStart %@", anim);
}

// 動畫值動態改變
- (void)pop_animationDidApply:(POPAnimation *)anim
{
    NSLog(@"pop_animationDidApply %@", anim);
}

// 動畫到達終點值
- (void)pop_animationDidReachToValue:(POPAnimation *)anim
{
    NSLog(@"pop_animationDidReachToValue %@", anim);
}

// 動畫結束
- (void)pop_animationDidStop:(POPAnimation *)anim finished:(BOOL)finished
{
    NSLog(@"pop_animationDidStop %@", anim);
}

@end

動畫代理方法能夠完整的表示出這個動畫執行的過程,從開始到結束到中間值的改變我們都能獲取到的.

 

4:按鈕的動畫效果

//
//  RootViewController.m
//  Animation
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import "YXEasing.h"
#import "POP.h"
#import "YXGCD.h"

@interface RootViewController ()<POPAnimationDelegate>

@property (nonatomic, strong) UIButton    *button;

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 完整顯示按住按鈕后的動畫效果
    _button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 70, 30)];
    _button.layer.cornerRadius = 5.f;
    _button.backgroundColor = [UIColor cyanColor];
    _button.center = self.view.center;
    [self.view addSubview:_button];
    
    // 按住按鈕后沒有松手的動畫
    [_button addTarget:self
                action:@selector(scaleToSmall)
      forControlEvents:UIControlEventTouchDown | UIControlEventTouchDragEnter];
    
    // 按住按鈕松手后的動畫
    [_button addTarget:self
                action:@selector(scaleAnimation)
      forControlEvents:UIControlEventTouchUpInside];
    
    // 按住按鈕后拖拽出去的動畫
    [_button addTarget:self
                action:@selector(scaleToDefault)
      forControlEvents:UIControlEventTouchDragExit];
}

- (void)scaleToSmall
{
    NSLog(@"scaleToSmall");
    
    POPBasicAnimation *scaleAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
    scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(0.75f, 0.75f)];
    [_button.layer pop_addAnimation:scaleAnimation forKey:@"layerScaleSmallAnimation"];
}

- (void)scaleAnimation
{
    NSLog(@"scaleAnimation");
    
    POPSpringAnimation *scaleAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
    scaleAnimation.velocity = [NSValue valueWithCGSize:CGSizeMake(3.f, 3.f)];
    scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(1.f, 1.f)];
    scaleAnimation.springBounciness = 18.0f;
    [_button.layer pop_addAnimation:scaleAnimation forKey:@"layerScaleSpringAnimation"];
}

- (void)scaleToDefault
{
    NSLog(@"scaleToDefault");
    
    POPBasicAnimation *scaleAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
    scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(1.f, 1.f)];
    [_button.layer pop_addAnimation:scaleAnimation forKey:@"layerScaleDefaultAnimation"];
}

@end

POP的動畫真心強大呢:)

 

5:Stroke動畫效果

//
//  RootViewController.m
//  Animation
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import "YXEasing.h"
#import "POP.h"
#import "YXGCD.h"
#import "CAShapeLayer+Circle.h"

@interface RootViewController ()<POPAnimationDelegate>

@property (nonatomic, strong) GCDTimer  *timer;

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //
    CAShapeLayer *layer = [CAShapeLayer LayerWithCircleCenter:self.view.center
                                                       radius:50.f
                                                   startAngle:DEGREES(180)
                                                     endAngle:DEGREES(180 + 360)
                                                    clockwise:YES
                                              lineDashPattern:nil];
    
    layer.strokeColor   = [UIColor cyanColor].CGColor;    // 邊緣線的顏色
    layer.lineCap       = kCALineCapRound;                // 邊緣線的類型
    layer.lineWidth     = 5.0f;                           // 線條寬度
    layer.strokeStart   = 0.0f;
    layer.strokeEnd     = 1.0f;
    
    [self.view.layer addSublayer:layer];
    
    _timer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];
    [_timer event:^{
        
        CGFloat value1 = arc4random()%100/100.f;
        CGFloat value2 = arc4random()%100/100.f;
        
        POPSpringAnimation *strokeAnimationEnd = \
            [POPSpringAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeEnd];
        strokeAnimationEnd.toValue = @(value1 > value2 ? value1 : value2);
        strokeAnimationEnd.springBounciness = 12.f;
        
        
        POPSpringAnimation *strokeAnimationStart = \
            [POPSpringAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeStart];
        strokeAnimationStart.toValue = @(value1 < value2 ? value1 : value2);
        strokeAnimationStart.springBounciness = 12.f;

        
        [layer pop_addAnimation:strokeAnimationEnd forKey:@"layerStrokeAnimation"];
        [layer pop_addAnimation:strokeAnimationStart forKey:@"layerStrokeAnimation1"];
        
    } timeInterval:1*NSEC_PER_SEC];
    [_timer start];
}

@end

 

6:減速動畫

//
//  RootViewController.m
//  Animation
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import "YXEasing.h"
#import "POP.h"
#import "YXGCD.h"

@interface RootViewController ()<POPAnimationDelegate>

@property(nonatomic) UIControl *dragView;

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    UIPanGestureRecognizer *recognizer = \
        [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                action:@selector(handlePan:)];
    
    self.dragView = [[UIControl alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    self.dragView.center = self.view.center;
    self.dragView.layer.cornerRadius = CGRectGetWidth(self.dragView.bounds)/2;
    self.dragView.backgroundColor = [UIColor cyanColor];
    [self.dragView addGestureRecognizer:recognizer];
    
    // 當觸目的時候移除動畫
    [self.dragView addTarget:self
                      action:@selector(touchDown:)
            forControlEvents:UIControlEventTouchDown];
    
    [self.view addSubview:self.dragView];
}

- (void)touchDown:(UIControl *)sender
{
    [sender.layer pop_removeAllAnimations];
}

- (void)handlePan:(UIPanGestureRecognizer *)recognizer
{
    // 拖拽
    CGPoint translation = [recognizer translationInView:self.view];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
    NSLog(@"center %@", NSStringFromCGPoint(recognizer.view.center));
    
    // 拖拽動作結束
    if(recognizer.state == UIGestureRecognizerStateEnded)
    {
        // 計算出移動的速度
        CGPoint velocity = [recognizer velocityInView:self.view];
        NSLog(@"velocity %@", NSStringFromCGPoint(velocity));
        
        // 衰退減速動畫
        POPDecayAnimation *positionAnimation = \
            [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPosition];
        
        // 設置代理
        positionAnimation.delegate = self;
        
        // 設置速度動畫
        positionAnimation.velocity = [NSValue valueWithCGPoint:velocity];
        
        // 添加動畫
        [recognizer.view.layer pop_addAnimation:positionAnimation
                                         forKey:@"layerPositionAnimation"];
    }
}

@end

計算出pan手勢的在拖拽結束的時候的速度值.

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM