用POP动画模拟真实秒钟摆动效果

简介:

用POP动画模拟真实秒钟摆动效果

静态图:

动画图:

此处用到了POP中的Spring系列动画,现提供源码如下:

SecondClockView.h 与 SecondClockView.m

//
//  SecondClockView.h
//  YouXianMingClock
//
//  Created by YouXianMing on 14-10-12.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface SecondClockView : UIView

/**
 *  Use in conjunction with 'springSpeed' to change animation effect. Values are converted into corresponding dynamics constants. Defined as a value in the range [0, 20]. Defaults to 18.
 */
@property (nonatomic, assign) CGFloat springBounciness;

/**
 *  The mass used in the dynamics simulation.
 */
@property (nonatomic, assign) CGFloat dynamicsMass;

/**
 *  Use in conjunction with 'springBounciness' to change animation effect. Values are converted into corresponding dynamics constants. Defined as a value in the range [0, 20]. Defaults to 18.
 */
@property (nonatomic, assign) CGFloat springSpeed;

/**
 *  给与时间进行的动画
 *
 *  @param second 当前秒
 */
- (void)startAnimationWithSecond:(float)second;

@end


//
//  SecondClockView.m
//  YouXianMingClock
//
//  Created by YouXianMing on 14-10-12.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "SecondClockView.h"
#import "POP.h"

/**
 *  将角度转换为弧度
 *
 *  @param d 角度
 *
 *  @return 弧度
 */
#define DEGREES__TO__RADIANS(d)  ((d) * M_PI / 180.f)

@interface SecondClockView ()

{
    
    BOOL firstTime;
    
}

@end

@implementation SecondClockView

- (void)startAnimationWithSecond:(float)second
{
    // 秒钟
    POPSpringAnimation *springAnimation = \
        [POPSpringAnimation animationWithPropertyNamed:kPOPLayerRotation];
    
    springAnimation.fromValue        = @(DEGREES__TO__RADIANS((360)/60.f)*(second - 1) + DEGREES__TO__RADIANS(-90));
    if (firstTime == NO) {
        firstTime = YES;
        springAnimation.fromValue    = @(0);
    }
    springAnimation.toValue          = @(DEGREES__TO__RADIANS((360)/60.f)*second + DEGREES__TO__RADIANS(-90));
    springAnimation.springBounciness = (_springBounciness > 0 && _springBounciness <= 20)?_springBounciness:18.f;
    springAnimation.dynamicsMass     = (_dynamicsMass > 0)?_dynamicsMass:1.5f;
    springAnimation.springSpeed      = (_springSpeed > 0 && _springSpeed <= 20)?_springSpeed:18.f;
    [self.layer pop_addAnimation:springAnimation forKey:nil];
}

@end

使用时候的情形

使用的时候请引入POP库

目录
相关文章
SwiftUI—如何制作循环动画并指定动画的循环次数
SwiftUI—如何制作循环动画并指定动画的循环次数
629 0
SwiftUI—如何制作循环动画并指定动画的循环次数
|
5月前
|
图形学
【unity实战】时间控制 昼夜交替 四季变化 天气变化效果
【unity实战】时间控制 昼夜交替 四季变化 天气变化效果
137 0
|
4月前
|
流计算 Python
Python实现动态银河系:模拟旋转的银河动画
Python实现动态银河系:模拟旋转的银河动画
61 0
labview数值型数据实验输入显示时间滑动杆旋钮仪表相加相减相乘滚动条
LabVIEW是一种程序开发环境,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。LabVIEW软件是NI设计平台的核心,也是开发测量或控制系统的理想选择。LabVIEW开发环境集成了工程师和科学家快速构建各种应用所需的所有工具,旨在帮助工程师和科学家解决问题、提高生产力和不断创新。
128 0
HIMA BV7046-4 准确地实现受控到达期望位置
HIMA BV7046-4 准确地实现受控到达期望位置
HIMA BV7046-4   准确地实现受控到达期望位置
B. Following Directions(模拟::坐标)
B. Following Directions(模拟::坐标)
38 0
|
调度
每日三题-跳跃游戏、根据身高重建队列、任务调度器
每日三题 跳跃游戏 根据身高重建队列 任务调度器
89 0
每日三题-跳跃游戏、根据身高重建队列、任务调度器
图片旋转 (30 分)(模拟)
图片旋转 (30 分)(模拟)
81 0