zoukankan      html  css  js  c++  java
  • iOS开发之UIDynamic

    1、概述

    什么是UIDynamic?

    UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架。

    可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象。比如:重力、弹性碰撞等现象。

    物理引擎的价值:

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

    (2)让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果

    (3)提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏

    知名的2D物理引擎:

    Box2d

    Chipmunk

    2、使用步骤

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

    第一步:创建一个物理仿真器(顺便设置仿真范围)。

    第二步:创建相应的物理仿真行为(顺便添加物理仿真元素)。

    第三步:将物理仿真行为添加到物理仿真器中 à 开始仿真。

    3、三大概念

    物理仿真元素(Dynamic Item)

    谁要进行物理仿真?

    注意:

    (1)不是任何对象都能做物理仿真元素

    (2)不是任何对象都能进行物理仿真

    这些对象才能做物理仿真元素:

    (1)任何遵守了UIDynamicItem协议的对象

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

    (3)UICollectionViewLayoutAttributes类默认也遵守UIDynamicItem协议

    物理仿真行为(Dynamic Behavior)

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

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

    UIGravityBehavior:重力行为

    UICollisionBehavior:碰撞行为

    UISnapBehavior:捕捉行为

    UIPushBehavior:推动行为

    UIAttachmentBehavior:附着行为

    UIDynamicItemBehavior:动力元素行为

    物理仿真行为须知:

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

    (2)所有的UIDynamicBehavior都可以独立进行

    (3)组合使用多种行为时,可以实现一些比较复杂的效果

    物理仿真器(Dynamic Animator)

    让物理仿真元素执行具体的物理仿真行为

    物理仿真器须知:

    (1)它可以让物理仿真元素执行物理仿真行为

    (2)它是UIDynamicAnimator类型的对象

    UIDynamicAnimator的初始化:

    - (instancetype)initWithReferenceView:(UIView *)view;

    view参数:是一个参照视图,表示物理仿真的范围

    UIDynamicAnimator的常见方法:

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

    添加1个物理仿真行为

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

    移除1个物理仿真行为

    - (void)removeAllBehaviors;

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

    UIDynamicAnimator的常见属性:

    @property (nonatomic, readonly) UIView* referenceView;

    参照视图

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

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

    @property (nonatomic, readonly, getter = isRunning) BOOL running;

    是否正在进行物理仿真

    @property (nonatomic, assign) id <UIDynamicAnimatorDelegate> delegate;

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

    4、重力行为(UIGravityAnimator

    简介:

    给定重力方向、加速度,让物体朝着重力方向掉落

    UIGravityBehavior的初始化:

    - (instancetype)initWithItems:(NSArray *)items;

    item参数 :里面存放着物理仿真元素

    UIGravityBehavior常见方法:

    - (void)addItem:(id <UIDynamicItem>)item;

    添加1个物理仿真元素

    - (void)removeItem:(id <UIDynamicItem>)item;

    移除1个物理仿真元素

    UIGravityBehavior常见属性

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

    添加到重力行为中的所有物理仿真元素

    @property (readwrite, nonatomic) CGVector gravityDirection;

    重力方向(是一个二维向量)

    @property (readwrite, nonatomic) CGFloat angle;

    重力方向(是一个角度,以x轴正方向为0°,顺时针正数,逆时针负数)

    @property (readwrite, nonatomic) CGFloat magnitude;

    量级(用来控制加速度,1.0代表加速度是1000 points /second²)

    例如,使一个UIImageView往下落效果

    设置成员属性:

    @property (nonatomic, strong) UIDynamicAnimator *animator;

    //第一步:创建一个物理仿真器(顺便设置仿真范围)。

    self.animator =

    [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

    //第二步:创建相应的物理仿真行为(顺便添加物理仿真元素)。

    UIGravityBehavior *gravity =

    [[UIGravityBehavior alloc] initWithItems:@[self.blueView]];

    //第三步:将物理仿真行为添加到物理仿真器中 à 开始仿真。

    [self.animator addBehavior:gravity];

    还可以将碰撞行为与上面重力行为合成一个动画,实现UIImageView落到屏幕最下边时加一个弹跳效果:

    //创建物理仿真行为--->重力行为(items: 物理仿真元素)

    UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.blueView]];

       

    //碰撞检测行为

    UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.blueView]];//可以添加多个,比如@[self.blueView,self.blueView2, self.blueView3]

    // 让参照视图的bounds成为碰撞检测的边框

    collision.translatesReferenceBoundsIntoBoundary = YES;

       

    //添加 物理仿真行为 到 物理仿真器

    [self.animator addBehavior:gravity];

    [self.animator addBehavior:collision];

    重点知识点:

    如果让你直接写,你或许会这样写:

    UIDynamicAnimator  *animator =

    [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

    UIGravityBehavior *gravity =

    [[UIGravityBehavior alloc] initWithItems:@[self.blueView]];

    [animator addBehavior:gravity];

    上面代码不会实现预料效果,因为执行完上面代码后animator会立即被销毁,来不及实现动画效果物理仿真器对象就被销毁了。这就是上面为什么把仿真器设置为成员属性的原因。这是个重要知识点,在其他方面也会经常遇到。

    5碰撞行为(UICollisionBehavior

    简介:

    (1)可以让物体之间实现碰撞效果

    (2)可以通过添加边界(boundary),让物理碰撞局限在某个空间中

    UICollisionBehavior边界相关的方法:

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

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

    - (UIBezierPath*)boundaryWithIdentifier:(id <NSCopying>)identifier;

    - (void)removeBoundaryWithIdentifier:(id <NSCopying>)identifier;

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

    - (void)removeAllBoundaries;

    UICollisionBehavior常见用法:

    @property (nonatomic, readwrite) BOOL translatesReferenceBoundsIntoBoundary;

    是否以参照视图的bounds为边界

    - (void)setTranslatesReferenceBoundsIntoBoundaryWithInsets:

    (UIEdgeInsets)insets;

    设置参照视图的bounds为边界,并且设置内边距

    @property (nonatomic, readwrite) UICollisionBehaviorMode collisionMode;

    碰撞模式(分为3种,元素碰撞、边界碰撞、全体碰撞)

    @property (nonatomic, assign, readwrite) id <UICollisionBehaviorDelegate> collisionDelegate;

    代理对象(可以监听元素的碰撞过程)

    6、捕捉行为(UISnapBehavior

    简介:

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

    UISnapBehavior的初始化:

    - (instancetype)initWithItem:(id <UIDynamicItem>)item snapToPoint:

    (CGPoint)point;

    UISnapBehavior常见属性:

    @property (nonatomic, assign) CGFloat damping;

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

    UISnapBehavior使用注意:

    如果要进行连续的捕捉行为,需要先把前面的捕捉行为从物理仿真器中移除

  • 相关阅读:
    IOS-在ARC项目中使用非ARC框架或者类库
    IOS-Social.framework
    IOS- 单例
    IOS-二维码的实现
    IOS-JSON & XML解析
    SCOI2011 地板 (BZOJ2331)
    Formula 1(URAL1519)
    Tour in the Castle(ZOJ3256 矩阵加速插头dp)
    Tony's tour(poj1739,男人题之一,插头dp)
    POJ3133(插头dp)
  • 原文地址:https://www.cnblogs.com/lifengfneg/p/4774070.html
Copyright © 2011-2022 走看看