美文网首页
8 DynamicAnimtor(物理仿真器) - 斯坦福 iO

8 DynamicAnimtor(物理仿真器) - 斯坦福 iO

作者: 以太死多 | 来源:发表于2016-05-23 16:02 被阅读65次

    - UIView 的动画

    为视图添加动画主要有3种方法:

    视图中有一些非常特殊的属性, 比如: frame``transform``alpha 属性.
    通过 animateWithDuration: 方法来实现:

        + (void)animateWithDuration:(NSTimeInterval)duration 
                               delay:(NSTimeInterval)delay 
                             options:(UIViewAnimationOptions)options 
                          animations:(void (^)(void))animations 
                          completion:(void (^)(BOOL finished))completion
    

    但有时候我们用的不是这三个属性, 而是一些其它自定义属性,比如我们控制卡牌的翻转, 用的就是让 faceUp = YES, 它本身并不是一个动画属性, 但我想让视图通过动画, 来实现卡牌的翻转, 我要通过某些动画, 来修改整个视图的状态属性
    通过 transitionWithView: 方法来实现:

        + (void)transitionWithView:(UIView *)view 
                           duration:(NSTimeInterval)duration 
                            options:(UIViewAnimationOptions)options 
                         animations:(void (^)(void))animations 
                         completion:(void (^)(BOOL finished))completion
    

    - Dynamic Animation

    定义一些物理规则, 然后应用于要添加动画效果的视图(View).

    如何进行理解?

    相当于有一个大的环境(地球),
    环境里面有一些"规则"(重力),
    "环境"中的"物体"(石头)都要遵循一定的"规则"(重力).

    大致的步骤:

    (1)创建一个环境(动力动画者)
    (2)创建规则(动力行为),并添加到环境中
    (3)创建在环境中的物体(动力项),并设置其要遵循的规则

    如何运用它?

    1.创建一个"环境" (动力动画者 UIDynamicAnimator *)

    新建一个 UIDynamicAnimator 对象, 可以创建一个或者多个, 是为了对这些行为进行进行分组

        UIDynamicAnimator *animator = [UIDynamicAnimator initWithReferenceView:aView];
    
    2.创建"规则",并添加到"环境中" (动力行为 UIDynamicBehavior *)

    创建规则如: 重力, 碰撞, 推动等等, 并把这些添加到环境中

        UIGravityBehavior *gravity = [UIGravityBehavior alloc] init];
        [animator addBehavior:gravity]; //把重力行为添加到(UIDynamicAnimator)动力动画者
    
    3.创建物体(动力项),并设置其要遵循的规则 (动力项 UIDynamicItem协议)
        //1.创建动力项
        id <UIDynamicItem> item1 = ...;
        
        //2.并设置其要遵循重力的规则
        [gravity addItem:item1];
    

    通常情况下,动力项都是 UIView (90%都是), 但也可以为非视觉项添加动画, 只要其实现的<UIDynamicItem>协议就可以.

    协议如下:

        @protocol UIDynamicItem
        
        @property (readonly) CGRect bounds;
        @property (readwrite) CGPoint center;
        @property (readwrite) CGAffineTransform transform;
        
        @end
    

    其中动力项的 center 和 transform 属性是由animator(动力动画者)进行设置的(动力动画者的作用就是弄清动力项的中心,旋转和缩放比例的值),如果你想和动力动画者同时设置动力项属性, 可以调用 updateItemUsingCurrentState:(id<UIDynamicItem>)item 方法,

    动力行为 Behaviors
    • UIGravityBehavior (重力行为)

    • UICollisionBehavior (碰撞行为)

    • UIAttachmentBehavior (吸附行为)

    • UIDynamicItemBehavior (动力项行为)

    • UIFieldBehavior (场行为)

    • UIPushBehavior (推动行为)

    • UISnapBehavior (速甩行为)

    • UIGravityBehavior (重力行为)

        @property (nonatomic,assign) CGFloat angle; //角度, 可设置重垂线的角度
        @property (nonatomic,assign) CGFloat magnitude; //设置重力的大小 1代表9.8N/m
      
    • UICollisionBehavior (碰撞行为)

        @property (nonatomic,assign) UICollisionBehaviorMode collisionMode;     //决定了动力项是相互碰撞弹开,还是只从边界碰撞弹开
        @property (nonatomic,assign) BOOL translatesReferenceBoundsIntoBoundary;        //将参考视图的边界,设置为有弹性的边界
        - (void)addBoundaryWithIdentifier:(NSString *)identifier forPath:(UIBezierPath *)path;      //添加一个UIBezierPath的碰撞边界,
      
    • UIAttachmentBehavior (吸附行为)
      通过它,可以将一个动力项吸附到一个固定锚点或另外一个动力项上.并且在初始化时指定吸附对象

    • UIDynamicItemBehavior (动力项行为)
      动力项内在的物理属性,设置动力项行为的基础属性(公共属性),比如摩擦力,弹力, 密度等, 它们在各个地方应该是一致的.

    • UIFieldBehavior (场行为)

    • UIPushBehavior (推动行为)
      推一下对象, 它就开始移动了

    • UISnapBehavior (速甩行为)
      速甩行为是将一个动力项甩到一个位置

    相关文章

      网友评论

          本文标题:8 DynamicAnimtor(物理仿真器) - 斯坦福 iO

          本文链接:https://www.haomeiwen.com/subject/dxyarttx.html