- 本文简单介绍了UIDynamic的以下三种物理仿真行为
-
UIGravityBehavior
:重力行为 -
UICollisionBehavior
:碰撞行为 -
UISnapBehavior
:捕捉行为
认识UIDynamic
UIDynamics是从iOS 7开始引入的一种新技术,隶属于UIKit框架的物理引擎。能模拟和仿真现实生活中的物理现象它可以让我们在程序中对界面元素添加一些行为从而达到诸如重力、碰撞等现实中的物理行为。
物理仿真元素
物理仿真元素,也就是执行仿真行为的载体。这里要注意的是,并 不是任何对象都能做物理仿真元素,只有遵守了UIDynamicItem协议的对象才能充当物理仿真元素
UIView
默认已经遵守了UIDynamicItem协议,因此任何UIView类型的控件都能实现物理仿真
代码实现
- 创建行为的方法
/**
为控件添加重力行为
:param: aimView 目标控件
*/
func addGravityBehaviorInView(aimView : UIView) {
// 1.创建重力行为,并且指定仿真元素
var gravity = UIGravityBehavior();
gravity .addItem(aimView);
// 设置重力的方向(默认角度M_PI_2)
gravity.angle = 0;
// 设置重力的大小
gravity.magnitude = 10.0;
// 设置重力的向量值
gravity.gravityDirection = CGVectorMake(0, 1.0);
//2.将重力行为添加到仿真器中
animator .addBehavior(gravity);
}
/**
添加碰撞行为
:param: aimView 目标控件
:param: bezierPath 边界
*/
func addCollisionBehaviorInView(aimView: UIView, withBoundary bezierPath: UIBezierPath) {
//1.创建碰撞行为
var collision = UICollisionBehavior(items: [aimView]);
//2.设置边界
collision .addBoundaryWithIdentifier("bezierPath", forPath: bezierPath);
//3.将碰撞行为添加到仿真器中
animator.addBehavior(collision);
}
/**
添加捕捉行为
:param: 仿真元素
:param: point 捕捉点
*/
func addCaptureBehaviorInView(aimView: UIView ,withPoint point: CGPoint) {
//1.创建捕捉行为
var snap = UISnapBehavior(item: aimView, snapToPoint: point);
//设置参数
snap.damping = 1; //阻力系数(0~1)
// 2. 添加到仿真器中
animator.addBehavior(snap);
}
点击rockfall按钮在试图内创建一个橙色控件,并同时为控件添加重力和碰撞行为 (这里碰撞行为依赖于重力所提供的动力)
- 注意:只有给碰撞行为设置了边界且仿真元素与边界接触才会产生碰撞
@IBAction func rockfall(sender: UIButton) {
let subView = UIView(frame: CGRectMake(10, 20, 40, 40));
subView.backgroundColor = UIColor.orangeColor();
view .addSubview(subView);
animator .removeAllBehaviors();
//重力
self.addGravityBehaviorInView(subView);
//碰撞
var bezierPath = UIBezierPath(rect: CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.width));
self.addCollisionBehaviorInView(subView, withBoundary: bezierPath);
}
效果图如下:
点击控制器,为棕色控件添加捕捉效果,捕捉点为当前触摸点
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
//移除之前的行为
animator.removeAllBehaviors();
//获取屏幕点击点
let touchP = (touches as NSSet).anyObject()?.locationInView(view);
//添加捕捉行为
self .addCaptureBehaviorInView(rect, withPoint: touchP!);
}
效果图如下:
最后附上github地址:https://github.com/laichunhui/UIDynamic