- 本文簡單介紹了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