仿真动画
UIDynamicAnimator
UIDynamicAnimator
是ios7新加的一个仿真动画,用于模拟现实世界中的物理模型,用于实现现实生活中的一些物理现象,主要包括UIAttachmentBehavior
(吸附行为), UICollisionBehavior
(碰撞行为), UIDynamicItemBehavior
(动态配置一些属性), UIGravityBehavior
(重力行为), UIPushBehavior
(推动行为), UISnapBehavior
(震荡行为)等。
动画实现
实现仿真动画的流程主要包括以下几个步骤:
1. 创建运动管理者
2. 创建运动行为
3. 添加运动行为
实现仿真动画的核心类主要是以下两个:
UIDynamicAnimator
UIDynamicAnimator
是一个运动管理者,用于指定实现动画的视图和添加动画。
创建运动管理者
通过以下方法可以实现一个运动管理者:
UIDynamicAnimator *dynamicAnimator = [[UIDynamicAnimator alloc]initWithReferenceView:self.animationView];
dynamicAnimator.delegate = self;
除了指定referenceView
外,UIDynamicAnimator
还有一个扩展类(UIDynamicAnimator (UICollectionViewAdditions)
)用于给UICollectionViewLayout
添加动画。如下所示:
- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout;
UIDynamicAnimator
可以设定UIDynamicAnimatorDelegate
协议,该协议主要实现了两个方法,如下所示:
//开始运动
- (void)dynamicAnimatorWillResume:(UIDynamicAnimator *)animator;
//结束运动
- (void)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator;
UIDynamicAnimator
可以通过以下三个方法进行行为管理
- (void)addBehavior:(UIDynamicBehavior *)behavior;
- (void)removeBehavior:(UIDynamicBehavior *)behavior;
- (void)removeAllBehaviors;
UIDynamicBehavior
UIDynamicBehavior
是一个用于创建运动行为的基类,派生的子类主要包括以下几个:
- UIGravityBehavior:重力行为
- UICollisionBehavior:碰撞行为
- ** UIAttachmentBehavior:吸附行为**
- UIDynamicItemBehavior:动力元素行为
- UISnapBehavior:震荡行为
- UIPushBehavior:推动行为
创建行为
-
重力行为
通过创建UIGravityBehavior
的对象,可以创建重力行为,UIGravityBehavior
主要包括以下三个属性:
//使用向量设置重力方向
@property (readwrite, nonatomic) CGVector gravityDirection;
//使用弧度设置重力方向
@property (readwrite, nonatomic) CGFloat angle;
//重力的加速度,设置越大,运动越快
@property (readwrite, nonatomic) CGFloat magnitude;
创建完重力行为后,再添加到运动管理者,代码如下所示:
// 1.创建一个动画管理者,使用self.view作为参照物
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
//TODO 这里一定要将animator设置成强引用,如果不使用property,直接用[animator addBehavior:gravityBehavior];将无法执行动画
_animator = animator;
// 2.创建动力学行为,并添加需要执行动画的视图
UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[self.animationView]];
// 设置向下的方向
gravityBehavior.angle = M_PI / 2;
// 设置加速度
gravityBehavior.magnitude = 20;
// 3.将动力学行为添加到动画者
[_animator addBehavior:gravityBehavior];
2.吸附行为
通过创建UIAttachmentBehavior
的对象,可以创建吸附行为,创建一个UIAttachmentBehavior
对象时候,需要指定一个锚点或者一个视图来做为吸附的位置。UIAttachmentBehavior
主要包括以下属性:
//用于设置吸附的类型,
@property (readonly, nonatomic) UIAttachmentBehaviorType attachedBehaviorType;
//设置锚点
@property (readwrite, nonatomic) CGPoint anchorPoint;
//设置吸附的距离
@property (readwrite, nonatomic) CGFloat length;
//阻尼系数
@property (readwrite, nonatomic) CGFloat damping;
//吸附频率,如果不设置,将来回运动,然后再慢慢停止
@property (readwrite, nonatomic) CGFloat frequency;