UIDynamic 是从iOS 7开始引入的一种新技术,属于UIKit框架,可以模拟现实生活中的物理现象,如:碰撞、抖动、摆动等

动力效果:有一个效果器,叫做“动力效果器”里面面可以添加“动力效果”

动力效果:可以将上一个效果移除

动力效果:可以叠加多个效果

------------------------------------------

使用UIDynamic 基本步骤:

1、创建一个动力效果器(UIDynamicAnimator)

2、创建动力效果(Behavior)添加到对应的视图上

3、将动力效果添加到动力效果器中(开始动力效果)

必须遵循UIDynamicItem这个协议才可以使用动力效果

UIView默认遵守UIDynamicItem协议

------------------------------------------

UIDynamic提供的动力效果

UIGravityBehavior:重力效果

UICollisionBehavior:碰撞效果

UIDynamicItemBehavior:动力元素效果

UIPushBehavior:推动效果

UISnapBehavior:迅速移动效果

UIAttachmentBehavior:附着效果

都继承自UIDynamicBehavior

------------------------------------------

动力效果器:UIDynamicAnimator

可以把UIDynamicAnimator看做动力效果的容器 它制定了动力效果的有效范围

在初始化的时候可以指定他的有效范围

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

作用在哪一个view上 哪一个view就是他产生动力效果的有效范围

------------------------------------------

动力效果器常用的属性

@property (nonatomic, readonly) UIView* referenceView;作用的区域

@property (nonatomic, readonly, copy) NSArray* behaviors;添加到效果器中的所有效果

@property (nonatomic, readonly, getter = isRunning) BOOL running;是否正在进行

@property (nonatomic, assign) id <UIDynamicAnimatorDelegate> delegate;可以检测开始暂停

- (void)dynamicAnimatorWillResume:(UIDynamicAnimator*)animator;

- (void)dynamicAnimatorDidPause:(UIDynamicAnimator*)animator;

------------------------------------------

既然是容器  他还可以添加移除 动力效果

- (void)addBehavior:(UIDynamicBehavior *)behavior; 添加动力效果

- (void)removeBehavior:(UIDynamicBehavior *)behavior; 移除动力效果

- (void)removeAllBehaviors; 移除之前添加过的所有动力效果

------------------------------------------

Behavior:动力效果

1、重力效果:UIGravityBehavior

设置重力方向、加速度、让物体(视图)朝着重力方向掉落

常用属性:

@property (nonatomic, readonly, copy) NSArray *items;添加到重力效果中的所有效果作用对象

@property (readwrite, nonatomic) CGVector gravityDirection;重力方向(是一个二维向量)以左上角为坐标原点 x 负数向左 正数向右  y 负数向上  正数向下  数字越大  重力效果越大

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

@property (readwrite, nonatomic) CGFloat magnitude;量级(用来控制加速度,1.0代表加速度是1000 points /second²)重力加速度越大 碰撞越厉害

------------------------------------------

2、UICollisionBehavior: 碰撞效果

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

也可以通过添加边界(boundary)在边界实现碰撞效果

常用属性:

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

@property (nonatomic, readwrite) UICollisionBehaviorMode collisionMode;

@property (nonatomic, readwrite) BOOL translatesReferenceBoundsIntoBoundary;

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

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

边界相关的方法

- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier forPath:(UIBezierPath*)bezierPath; 添加一个贝塞尔曲线路径的边界

- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2; 通过添加两个点连成的线 作为边界

- (UIBezierPath*)boundaryWithIdentifier:(id <NSCopying>)identifier; 通过ID找到边界路径

- (void)removeBoundaryWithIdentifier:(id <NSCopying>)identifier; 移除ID对应的边界

@property (nonatomic, readonly, copy) NSArray* boundaryIdentifiers; 边界数组

- (void)removeAllBoundaries;移除所有边界

typedef NS_OPTIONS(NSUInteger, UICollisionBehaviorMode) {

UICollisionBehaviorModeItems        = 1 << 0,元素碰撞

UICollisionBehaviorModeBoundaries   = 1 << 1,边界碰撞

UICollisionBehaviorModeEverything   = NSUIntegerMax 全体碰撞

} NS_ENUM_AVAILABLE_IOS(7_0);

//两个元素相互碰撞

- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p;

- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2;

// 视图碰撞边界的时候 触发

- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier atPoint:(CGPoint)p;

- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier;

------------------------------------------

3、UIDynamicItemBehavior 动力元素效果

可以设置 动力效果的默认值 是一个辅助的效果 设置运动学元素参与物理效果过程中的参数 如:弹性系数、摩擦系数、密度、阻力、角阻力以及是否允许旋转等

常用属性

@property (readwrite, nonatomic) CGFloat elasticity; // Usually between 0 (inelastic) and 1 (collide elastically) 属性设置碰撞弹性系数 范围(0.0-1.0)决定了碰撞的弹性程度,比如碰撞时物体的弹性

@property (readwrite, nonatomic) CGFloat friction; // 0 being no friction between objects slide along each other设置摩擦系数 决定了沿接触面滑动时的摩擦力大小

@property (readwrite, nonatomic) CGFloat density; // 1 by default 密度   跟size相关 计算物体的总质量 质量越大 物体加速或减速就越困难

@property (readwrite, nonatomic) CGFloat resistance; // 0: no velocity damping (阻力):决定线性移动的阻力大小 与摩擦系数不同 摩擦系数只作用于滑动运动

@property (readwrite, nonatomic) CGFloat angularResistance; // 0: no angular velocity damping 设置角度阻力系数。(0--CGFLOAT_MAX)决定旋转运动时的阻力大小

@property (readwrite, nonatomic) BOOL allowsRotation; // force an item to never rotate 设置行为中的dynamic item是否可以旋转  设置这个属性为 NO 物体就完全不会转动,而无论施加多大的转动力

--------------------------------

4、 UIPushBehavior :推动效果

typedef NS_ENUM(NSInteger, UIPushBehaviorMode) {

UIPushBehaviorModeContinuous, 持续的力

UIPushBehaviorModeInstantaneous 瞬间的力

} NS_ENUM_AVAILABLE_IOS(7_0);

@property (nonatomic, readonly) UIPushBehaviorMode mode; 推动效果的样式

@property (nonatomic, readwrite) BOOL active; 是否激活

@property (readwrite, nonatomic) CGFloat angle; 推动角度

// A continuous force vector with a magnitude of 1.0, applied to a 100 point x 100 point view whose density value is 1.0, results in view acceleration of 100 points per s^2

@property (readwrite, nonatomic) CGFloat magnitude; 推动力量

@property (readwrite, nonatomic) CGVector pushDirection; 推动的方向

------------------------------

5、 UISnapBehavior:迅速移动效果

// The point argument is expressed in the reference coordinate system

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

迅速移动效果 只能一次 添加到一个元素上  snapToPoint 让他移动到哪一个点

@property (nonatomic, assign) CGFloat damping; // damping value from 0.0 to 1.0. 0.0 is the least oscillation. damping 的范围是(0.0-1.0)

------------------------------

6、 UIAttachmentBehavior:附着效果

吸附着一个视图 或者一个点  (也可以多个连接)

附着效果 一个视图与一个锚点或者另一个视图相连接的情况

附着行为描述的是两点之间的连接情况,可以模拟刚性或者弹性连接

在多个物体间设定多个UIAttachmentBehavior,可以模拟多物体连接

typedef NS_ENUM(NSInteger, UIAttachmentBehaviorType) {

UIAttachmentBehaviorTypeItems, 吸附一个元素

UIAttachmentBehaviorTypeAnchor 吸附一个点

} NS_ENUM_AVAILABLE_IOS(7_0);

设置吸附效果的样式

@property (readonly, nonatomic) UIAttachmentBehaviorType attachedBehaviorType;

@property (readwrite, nonatomic) CGPoint anchorPoint;锚点

@property (readwrite, nonatomic) CGFloat length;距离 与锚点的距离

@property (readwrite, nonatomic) CGFloat damping; // 1: critical damping  跳跃度

@property (readwrite, nonatomic) CGFloat frequency; // in Hertz   幅度

UIDynamic 基础认识的更多相关文章

  1. UIDynamic 基础

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

  2. iOS基础 - UIDynamic

    一.UIKit动力学 UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果,即将2D物理引擎引入了UIKit 注意:UIKit动力学的引入,并不是 ...

  3. 自定义UICollectionViewLayout并添加UIDynamic - scorpiozj(转)

    转载自:http://www.tuicool.com/articles/jM77Vf     自定义UICollectionViewLayout并添加UIDynamic UICollectionVie ...

  4. UIDynamic(一)

    UIDynamic(一) 前言 最近看了一下UIDynamic,UIDynamic是13年WWDC出的技术.其实本人一直热衷于比较有趣的动画,特别是带物理力学的动画,感觉物理力学就是动画的灵魂,一直想 ...

  5. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  6. node-webkit 环境搭建与基础demo

    首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...

  7. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  8. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  9. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

随机推荐

  1. .NET下的延迟加载

    在应用中有很多实例可能需要延迟创建对象, 比如设计模式中的单例模式就是一种非常常见的情况.如果不考虑线程安全我们通常会编写如下代码: public class SingleInstance { pri ...

  2. UOJ #142. 【UER #5】万圣节的南瓜灯 并查集

    #142. [UER #5]万圣节的南瓜灯 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/142 Descrip ...

  3. spring读取properties的方法

    首先在配置文件中配置PropertyPlaceholderConfigurer 单个配置文件: <bean id="propertyConfigurer" class=&qu ...

  4. iOS开发——UI篇OC篇&layoutSubviews和drawRect

    layoutSubviews和drawRect     首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘.   layoutSubviews在以下情况下 ...

  5. 免费的天气预报API--谷歌,雅虎,中央气象台

    Google Weather API 仅仅支持美国地区使用邮政编码进行查询,比如:  http://www.google.com/ig/api?hl=zh-cn&weather=94043  ...

  6. ADO.NET中使用事务进行数据库读写的办法

    使用事务一般是进行数据写入,数据读取一般是不需要这货的 第一种办法: 使用存储过程: 顾名思义,在存储过程中定义好变量,定义好事务开始,结束,错误回滚然后在ADO.NET中正常调用存储过程的方法就行 ...

  7. fedora 安装lamp

    一.安装apache服务器1.1使用yum进行安装:# yum install httpd1.2配置Apache能够随系统启动而启动#chkconfig --levels 235 httpd on1. ...

  8. 用联想wndows8系统做android调试开发,adb server无法启动的原因

    今天换了台笔记本,联想V480的,装好开发软件,配置好一环境,于是打算先试一下能不能用,结果在eclipse devices中死活看不到设备,于是开如找各种问题,最后在度娘的帮助下终于找到了答案,我的 ...

  9. 解决iphone横屏时字体变大问题或者内容大小不一样等

    在样式表中增加: @media screen and (max-device-width: 320px){body{-webkit-text-size-adjust:none}} @media scr ...

  10. Android XML文件布局各个属性详解

    第一常用类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android: ...