美文网首页iOS
iOS视频直播(物理仿真引擎全面了解)

iOS视频直播(物理仿真引擎全面了解)

作者: LLIOS4 | 来源:发表于2016-08-01 10:42 被阅读131次

    UIDynamic 物理仿真引擎全面了解


    UIDynamic 是从 iOS 7开始引入的一种新技术,隶属于UIKit框架可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象,如:重力、弹性碰撞等现象


    物理引擎的价值

    广泛用于游戏开发,经典成功案例是“愤怒的小鸟”。


    知名的2D物理引擎

    Box2d

    Chipmunk


    三个概念

    1.仿真元素(Dynamic Item)(也就是运动的那个元素)

    物理仿真元素要素:

    任何遵守了UIDynamicItem协议的对象

    UIView 默认已经遵守了 UIDynamicItem 协议,因此任何 UI 控件都能做物理仿真 UICollectionViewLayoutAttributes 类默认也遵守 UIDynamicItem 协议

    2.仿真行为(Dynamic Behavior)(也就是仿真元素的几种物理状态)

    执行怎样的物理仿真效果?怎样的动画效果?

    UIDynamic提供了以下几种物理仿真行为:

    UIGravityBehavior:重力行为

    UICollisionBehavior:碰撞行为

    UISnapBehavior:捕捉行为

    UIPushBehavior:推动行为

    UIAttachmentBehavior:附着行为

    UIDynamicItemBehavior:动力元素行为

    上述所有物理仿真行为都继承自 UIDynamicBehavior

    所有的 UIDynamicBehavior 都可以独立进行,组合使用多种行为时,可以实现一些比较复杂的效果                                                                                          (  意思就是都可以单独实现,放在一起可以 实现复杂的效果:如:一个物理UIGravityBehavior下降,发生UICollisionBehavior)

    2.物理仿真器(Dynamic Animator)(也就是仿真元素的几种物理状态)

    让物理仿真元素执行具体的物理仿真行为,UIDynamicAnimator 类型的对象

    物理仿真器 相关方法:

    -(instancetype)initWithReferenceView:(UIView *)view;  (view意思是在那个视图为参考视图,并非范围)

    UIDynamicAnimator 的常见方法:

    //添加1个物理仿真行为

    - (void)addBehavior:(UIDynamicBehavior*)behavior;

    //移除1个物理仿真行为

    - (void)removeBehavior:(UIDynamicBehavior*)behavior;

    //移除之前添加过的所有物理仿真行为

    - (void)removeAllBehaviors;

    //参照视图

    @property(nonatomic,readonly)UIView* referenceView;

    //添加到物理仿真器中的所有物理仿真行为

    @property(nonatomic,readonly,copy)NSArray* behaviors;

    //是否正在进行物理仿真

    @property(nonatomic,readonly, getter = isRunning)BOOLrunning;

    //代理对象(能监听物理仿真器的仿真过程,比如开始和结束

    @property(nonatomic,assign)id delegate;

    使用步骤

    要想使用UIDynamic来实现物理仿真效果,大致的步骤如下

    1.创建一个物理仿真器(顺便设置仿真范围)

    2.创建相应的物理仿真行为(顺便添加物理仿真元素)

    3.将物理仿真行为添加到物理仿真器中开始仿真

    UIGravityBehavior 重力行为

    常用方法:

    - (instancetype)initWithItems:(NSArray*)items;  // UIGravityBehavior的初始化,item参数 :里面存放着物理仿真元素

    - (void)addItem:(id)item;                                          // 添加1个物理仿真元素

    - (void)removeItem:(id)item;                                   // 移除1个物理仿真元素

    UIGravityBehavior常见属性

    @property(nonatomic,readonly,copy)NSArray* items;                              // 添加到重力行为中的所有物理仿真元素

    @property(readwrite,nonatomic)CGVectorgravityDirection;                   // 重力方向(是一个二维向量)

    @property(readwrite,nonatomic)CGFloatangle;                                        // 重力方向(是一个角度,以x轴正方向为0°,顺时针正数,逆时针负数)

    @property(readwrite,nonatomic)CGFloatmagnitude;                              // 量级(用来控制加速度,1.0代表加速度是1000 points /second²)

    UICollisionBehavior 碰撞行为

    可以让物体之间实现碰撞效果,可以通过添加边界(boundary),让物理碰撞局限在某个空间中

    UICollisionBehavior 边界相关的方法

    - (void)addBoundaryWithIdentifier:(id)identifier forPath:(UIBezierPath*)bezierPath;

    - (void)addBoundaryWithIdentifier:(id)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2;

    - (UIBezierPath*)boundaryWithIdentifier:(id)identifier;

    - (void)removeBoundaryWithIdentifier:(id)identifier;

    @property(nonatomic,readonly,copy)NSArray* boundaryIdentifiers;

    - (void)removeAllBoundaries;

    UISnapBehavior 捕捉行为

    可以让物体迅速冲到某个位置(捕捉位置),捕捉到位置之后会带有一定的震动

    UISnapBehavior的初始化

    - (instancetype)initWithItem:(id)item snapToPoint:(CGPoint)point;

    UISnapBehavior常见属性

    // 用于减幅、减震(取值范围是0.0 ~ 1.0,值越大,震动幅度越小)

    @property(nonatomic,assign)CGFloatdamping;

    UIPushBehavior 推动行为

    UIPushBehavior*pushBehavior = [[UIPushBehavioralloc] initWithItems:@[self.image] mode:UIPushBehaviorModeInstantaneous];

    // vector 矢量 ,控制 push 的方向

    pushBehavior.pushDirection=CGVectorMake((velocity.x/10) , (velocity.y/10));

    // magnitude 的属性控制 push 的快慢 必须慢慢试才能找出最合适的值

    pushBehavior.magnitude= magnitude 

    // ThrowingVelocityPadding;

    self.pushBehavior= pushBehavior;

    [self.animatoraddBehavior:self.pushBehavior];

    UIAttachmentBehavior:附着行为

    具体来说就是我手怎么动,UIAttachmentBehavior 指定的 view 就怎么动

    - (IBAction)handleAttachmentGesture:(UIPanGestureRecognizer*)pan{

    // 在手势开始时添加 物理仿真行为

    if(pan.state==UIGestureRecognizerStateBegan) {

    // 首先要移除物理仿真行为

    [self.animatorremoveAllBehaviors];

    // 获取手势在 view 容器中的位置

    CGPointlocation = [pan locationInView:self.view];

    // 获取手势在 lightBlueView 中的位置

    CGPointboxLocation = [pan locationInView:self.lightBlueView];

    // 以 lightBlueView 为参考坐标系,计算触摸点到 lightBlueView 中点的偏移量

    UIOffsetoffset =UIOffsetMake(boxLocation.x-CGRectGetMidX(self.lightBlueView.bounds), boxLocation.y-CGRectGetMidY(self.lightBlueView.bounds));

    // 创建物理仿真行为

    self.attach= [[UIAttachmentBehavioralloc] initWithItem:self.lightBlueViewoffsetFromCenter:offset attachedToAnchor:location];        [self.animatoraddBehavior:self.attach];  

      }   

     [self.attachsetAnchorPoint:[pan locationInView:self.view]];

    }

    下面介绍一下 UIAttachmentBehavior 的属性:

    @property(readonly,nonatomic)UIAttachmentBehaviorType attachedBehaviorType;

    // 该锚点关联物理仿真元素附着的点,在这个例子中,就是你的手指所触摸的那个点,

    // lightBlueView 是围绕这个点在运动的。

    @property(readwrite,nonatomic)CGPointanchorPoint;

    @property(readwrite,nonatomic)CGFloatlength;// 衰减,经测试,这个值越大,可以减震@property(readwrite,nonatomic)CGFloatdamping;// 该值越大,物理仿真元素运动越剧烈@property(readwrite,nonatomic)CGFloatfrequency;// 反抗旋转的程度@property(readwrite,nonatomic)CGFloatfrictionTorqueNS_AVAILABLE_IOS(9_0);

    @property(readwrite,nonatomic)UIFloatRangeattachmentRangeNS_AVAILABLE_IOS(9_0);

    UIDynamicItemBehavior:动力元素行为

    具体作用:给一个仿真元素设置各种物理属性。比如:

    allowsRotation :是否允许旋转

    resistance: 抗阻力 0~CGFLOAT_MAX ,阻碍原有所加注的行为(如本来是重力自由落体行为,则阻碍其下落,阻碍程度根据其值来决定)

    friction: 磨擦力 0.0~1.0 在碰撞行为里,碰撞对象的边缘产生

    elasticity:弹跳性 0.0~1.0

    density:密度 0~1

    - (UIView*) newViewWithCenter:(CGPoint)paramCenter  backgroundColor:(UIColor*)paramBackgroundColor{

                       UIView*newView = [[UIViewalloc] initWithFrame:CGRectMake(0.0f,0.0f,50.0f,50.0f)];

                       newView.backgroundColor= paramBackgroundColor;

                      newView.center= paramCenter;

                      returnnewView;

    }

    相关文章

      网友评论

        本文标题:iOS视频直播(物理仿真引擎全面了解)

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