zoukankan      html  css  js  c++  java
  • IOS-UIDynamic

    UIDynamic中的三个重要概念

    Dynamic Animator:动画者,为动力学元素提供物理学相关的能力及动画,同时为这些元素提供相关的上下文,是动力学元素与底层iOS物理引擎之间的中介,将Behavior对象添加到Animator即可实现动力仿真
    Dynamic Animator Item:动力学元素,是任何遵守了UIDynamicItem协议的对象,从iOS 7.0开始,UIView和UICollectionViewLayoutAttributes默认实现该协议。如果自定义的对象实现了该协议,即可通过Dynamic Animator实现物理仿真
    UIDynamicBehavior:仿真行为,是动力学行为的父类,基本的动力学行为类UIGravityBehavior、UICollisionBehavior、UIAttachmentBehavior、UISnapBehavior、UIPushBehavior以及UIDynamicItemBehavior均继承自该父类
     
    动力学动画元素(Dynamic Animator Item)协议
    只有遵守了UIDynamicItem协议的对象才可以参与到UI动力学仿真中
    从iOS 7开始,UIView和UICollectionViewLayoutAttributes 类默认实现了该协议
    协议定义的属性:
    bounds:Dynamic animator需要动画元素的边框时调用,只读属性,用于计算物体的边界以及质量
    center:动力学元素的中心点,读写属性
    transform:动力学元素的旋转角度,读写属性(需要指定Layer的形变属性)
     
    动力学行为(Dynamic Behavior)
    iOS7.0中提供的动力学行为包括:
    UIGravityBehavior:重力行为
    UICollisionBehavior:碰撞行为
    UIAttachmentBehavior:附着行为
    UISnapBehavior:吸附行为
    UIPushBehavior:推行为
    UIDynamicItemBehavior:动力学元素行为
    所有的UIDynamicBehavior都是可以独立作用,同时也遵守力的合成。也就是说,组合使用行为可以实现一些较复杂的效果
     
    重力行为(Gravity)
    重力行为用于给动力学元素指定一个重力向量

    // 实例化一个重力行为,并传入需要做动力仿真的对象view

    UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[view]];

    // 将重力行为添加到animator

    [animator addBehavior:gravity];
     
    碰撞行为(Collision)
    碰撞行为用于指定一组动力学元素,在指定的边界范围内,可以彼此发生碰撞
    碰撞行为提供了代理方法,可用于在物体碰撞前、后对动力学元素做碰撞后续的处理

    // 实例化碰撞行为,并指定view参与碰撞

    UICollisionBehavior *collsion = [[UICollisionBehavior alloc] initWithItems:@[view]];

    // 指定是否启用参照系的边界

    collsion.translatesReferenceBoundsIntoBoundary = YES;

    // 将碰撞行为添加至animator

    [animator addBehavior:collsion];

    吸附行为(Snap)

    吸附行为可以将视图通过动画吸附到某个点上
    初始化设定一下UISnapBehavior的initWithItem:snapToPoint:即可
    属性:
    damping:振幅大小,默认为0.5f

    / 删除之前的吸附行为

    [_animator removeBehavior:_snap];

    CGPoint location = [sender locationInView:self.view];

    _snap = [[UISnapBehavior alloc] initWithItem:_boxImageView snapToPoint:location];

    // 生成随机振幅

    CGFloat damping = arc4random_uniform(10) + 1;

    _snap.damping = damping / 10.0f;

    [_animator addBehavior:_snap];

     
    附着行为(Attachment)
    附着行为描述一个视图与一个锚点或者另一个视图相连接的情况
    附着行为描述的是两点之间的连接情况,可以模拟刚性或者弹性连接
    在多个物体间设定多个UIAttachmentBehavior,可以模拟多物体连接
    属性:
    attachedBehaviorType:连接类型(连接到锚点或视图)
    items:连接视图数组
    anchorPoint:连接锚点
    length:距离连接锚点的距离
    只要设置了以下两个属性,即为弹性连接
    damping:振幅大小
    frequency:振动频率

    if (UIGestureRecognizerStateBegan == sender.state) {

        // 创建附加刚性行为

          CGPoint anchorPoint = CGPointMake(_boxImageView.center.x, _boxImageView.center.y);

        _attachment = [[UIAttachmentBehavior alloc] initWithItem:_boxImageView offsetFromCenter:UIOffsetMake(-25.0, -25.0) attachedToAnchor:anchorPoint];

        [_animator addBehavior:_attachment];

    } else if (UIGestureRecognizerStateChanged == sender.state) {

        // 设置行为的锚点

        [_attachment setAnchorPoint:[sender locationInView:self.view]];

    } else if (UIGestureRecognizerStateEnded == sender.state) {

        // 删除附加行为

        [_animator removeBehavior:_attachment];

    }

    //附加弹性行为

    if (UIGestureRecognizerStateBegan == sender.state) {

        CGPoint anchor = CGPointMake(_boxImageView.center.x, _boxImageView.center.y - 100);

        _attachment = [[UIAttachmentBehavior alloc] initWithItem:_boxImageView attachedToAnchor:anchor];

        [_animator addBehavior:_attachment];

        [_attachment setFrequency:1.0f];

        [_attachment setDamping:0.1f];

    } else if (UIGestureRecognizerStateChanged == sender.state) {

        [_attachment setAnchorPoint:[sender locationInView:self.view]];

    } else if (UIGestureRecognizerStateEnded == sender.state) {

        [_animator removeBehavior:_attachment];

    }

     
    推行为(Push)
    •推行为可以为一个视图施加一个作用力,该力可以是持续的,也可以是一次性的
    •可以设置力的大小,方向和作用点等信息
    •属性:
    •mode:推动类型(一次性或是持续推)
    •active:是否激活,如果是一次性推,需要激活
    •angle:推动角度
    •magnitude:推动力量

    // 计算两点之间距离

    CGFloat distance = sqrtf(powf(p.x - _firstPoint.x, 2.0) + powf(p.y - _firstPoint.y, 2.0));

    CGFloat angle = atan2(p.y - _firstPoint.y, p.x - _firstPoint.x);

    _push.magnitude = distance / 20;

    _push.angle = angle;

    [_push setActive:YES];

     
    动力学元素行为(DynamicItem)
    •是一个辅助的行为,用来设置运动学元素参与物理仿真过程中的参数,如:弹性系数、摩擦系数、密度、阻力、角阻力以及是否允许旋转等
    Øelasticity(弹性系数):决定了碰撞的弹性程度,比如碰撞时物体的弹性
    Øfriction(摩擦系数) :决定了沿接触面滑动时的摩擦力大小
    Ødensity(密度): 跟size结合使用,计算物体的总质量。质量越大,物体加速或减速就越困难
    Øresistance(阻力):决定线性移动的阻力大小,与摩擦系数不同,摩擦系数只作用于滑动运动
    ØangularResistance(角阻力) :决定旋转运动时的阻力大小
    ØallowsRotation(允许旋转):这个属性很有意思,它在真实的物理世界没有对应的模型。设置这个属性为 NO 物体就完全不会转动,而无论施加多大的转动力
     
  • 相关阅读:
    沟通是项目管理知识体系中的九大知识领域之一
    项目管理的三要素时间、成本、质量
    项目管理提升效率的几大关键点
    收到FRDMKL02Z
    【转】arm 开发工具比较(ADS vs RealviewMDK vs RVDS)
    你不能自己把自己放弃写在毕业季
    【转】为什么你应该(从现在开始就)写博客
    Vivado 2014.4 FFT IP 使用及仿真
    项目需求的一些事
    娇荣电子工作室成立了
  • 原文地址:https://www.cnblogs.com/mcj-coding/p/3558540.html
Copyright © 2011-2022 走看看