設置碰撞行爲的代理,碰撞到邊界之後改變物體的狀態 - (void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier atPoint:(CGPoint)p { //開始的碰撞物體 UIView *view = (UIView *)item; //邊界的id NSString *strId = (NSString *)identifier; //當碰撞到黃色邊界之後改變當前物體的顏色 if ([strId isEqualToString:@"b2"]) { [UIView animateWithDuration:0.3 animations:^{ view.backgroundColor = [UIColor blackColor]; } completion:^(BOOL finished) { view.backgroundColor = [UIColor redColor]; }]; } }
1. 什麼是UIDynamic數組
UIDynamic是從iOS 7開始引入的一種新技術,隸屬於UIKit框架 能夠認爲是一種物理引擎,能模擬和仿真現實生活中的物理現象 如:重力、彈性碰撞等現象框架
注意:UIKit動力學的引入,並非爲了替代CA或者UIView動畫,在絕大多數狀況下CA或 者UIView動畫仍然是最優方案,只有在須要引入逼真的交互設計的時候,才須要使用 UIKit動力學它是做爲現有交互設計和實現的一種補充演示ide
2. 相關概念動畫
a. 首先要肯定誰要進行物理仿真?spa
物理仿真元素(Dynamic Item):是任何遵照了UIDynamicItem協議的對象設計
b. 執行怎樣的物理仿真效果?怎樣的動畫效果?代理
物理仿真行爲(Dynamic Behavior) 仿真行爲,是動力學行爲的父類,基本的動力學行爲類 UIGravityBehavior、UICollisionBehavior、UIAttachmentBehavior、UISnapBehavior、UIPushBehavior以及UIDynamicItemBehavior均繼承自該父類,能夠組合使用。code
c. 讓物理仿真元素執行具體的物理仿真行爲:物理仿真器(Dynamic Animator)orm
爲動力學元素提供物理學相關的能力及動畫,同時爲這些元素提供相關的上下文,是動力學元素與底層iOS物理引擎之間的中介,將Behavior對象添加到 Animator便可實現動力仿真對象
d. 注意不是任何對象均可以作物理仿真效果 物理仿真元素要素:
任何遵照了UIDynamicItem協議的對象 UIView默認已經遵照了UIDynamicItem協議,所以任何UI控件都能作物理仿真 UICollectionViewLayoutAttributes類默認也遵照UIDynamicItem協議
3.物理仿真行爲 UIDynamic的物理仿真行爲只能針對矩形操做。不支持其它形狀
01-重力行爲(Gravity)
1. 重力行爲用於給動力學元素指定一個重力向量
2. 代碼示例
//1 建立物理仿真器
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc]
initWithReferenceView:self.redView];
self.animator = animator;
//2 建立重力行爲(物理行爲)
UIGravityBehavior *behavior = [[UIGravityBehavior alloc]
initWithItems:@[self.redView]];
//量級(用來控制加速度,1.0表明加速度是1000 points/second2)
behavior.magnitude = 0.2;
//方向
//
behavior.gravityDirection = CGVectorMake(1, 1);
behavior.angle = 0;
//3 把物理行爲添加到物理仿真器中 開始動畫
[animator addBehavior:behavior];
02-碰撞行爲(Collision)
1. 相關屬性
translatesReferenceBoundsIntoBoundary
translatesReferenceBoundsIntoBoundary設置爲YES而不是明確的添加邊界的座標。這樣會使這
個邊界使用 UIDynamicAnimator 提供的參考系的邊界。
collisionMode
UICollisionBehaviorModeItems 碰到元素碰撞,邊界不碰撞
UICollisionBehaviorModeBoundaries 碰到邊界碰撞,元素不碰撞
UICollisionBehaviorModeEverything 默認,碰到邊界或元素會發生碰撞
2. 代碼示例
//1 建立物理仿真器,動畫的範圍
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
//2 建立物理仿真行爲
//2.1 重力行爲
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.redView]];
//2.2 碰撞行爲
UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.redView]];
//2.3 碰撞的邊界,translatesReferenceBoundsIntoBoundary設置爲YES而不是明確的添加邊界的坐
//標。這樣會使這個邊界使用 UIDynamicAnimator 提供的參考系的邊界。
collision.translatesReferenceBoundsIntoBoundary = YES;
//3 把物理仿真行爲添加到物理仿真器中
[self.animator addBehavior:gravity];
[self.animator addBehavior:collision];
碰撞行爲-其它
1. 兩種自定義邊界的方式,設置直線
a. 添加邊界,設置兩個點
[collision addBoundaryWithIdentifier:@"b1" fromPoint:CGPointMake(0, 200) toPoint:CGPointMake(180, 250)];
b. 使用路徑的方式
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(0, 200)];
[path addLineToPoint:CGPointMake(180, 250)];
[collision addBoundaryWithIdentifier:@"b1" forPath:path];
2. 自定義邊界,設置矩形的邊界
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 200, 180, 20)];
[collision addBoundaryWithIdentifier:@"b2" forPath:path];
3. 碰撞過程當中監聽frame的變化 [collision setAction:^{
NSLog(@"%@",NSStringFromCGRect(self.redView.frame)); }];
4. 碰撞行爲的彈力系數(0-1之間)
UIDynamicItemBehavior *item = [[UIDynamicItemBehavior alloc] initWithItems: @[self.redView]];
item.elasticity = 1;
添加到物理仿真器中
[self.animator addBehavior:item];
03-捕捉行爲(Snap):也叫吸附行爲
1. 代碼示例
//1 物理仿真器
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
//2 建立捕捉行爲
UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:self.redView snapToPoint:location]; //阻尼,減幅,衰減 取值(0-1)
snap.damping = 0;
//3 把行爲添加到物理仿真器
[self.animator addBehavior:snap];
04-附着行爲(Attachment)
1. 附着行爲描述一個視圖與一個錨點或者另外一個視圖相鏈接的狀況附着 行爲描述的是兩點之間的鏈接狀況,能夠模擬剛性或者彈性鏈接在多 個物體間設定多個UIAttachmentBehavior,能夠模擬多物體鏈接
2. 屬性:
attachedBehaviorType:鏈接類型(鏈接到錨點或視圖) items:鏈接視圖數組
anchorPoint:鏈接錨點
length:距離鏈接錨點的距離
只要設置瞭如下兩個屬性,即爲彈性鏈接
damping:振幅大小
frequency:振動頻率
05-推進行爲(Push)
1. 推行爲能夠爲一個視圖施加一個做用力,該力能夠是持續的,也能夠是一次性的能夠設置力的大小,方
向和做用點等信息
2. 屬性: mode:推進類型(一次性或是持續推) angle:推進角度
magnitude:推進力量
UIDynamicItemBehavior:元素行爲
DynamicItem是一個輔助的行爲,用來設置運動學元素參與物理仿真過程當中的參數,如:彈性係數、摩擦係數、密度、阻力、角阻力以及是否容許旋轉等
elasticity(彈性係數):決定了碰撞的彈性程度,好比碰撞時物體的彈性
friction(摩擦係數) :決定了沿接觸面滑動時的摩擦力大小
density(密度): 跟size結合使用,計算物體的總質量。質量越大,物體加速或減速就越困難
resistance(阻力):決定線性移動的阻力大小,與摩擦係數不一樣,摩擦係數只做用於滑動運動
angularResistance(角阻力) :決定旋轉運動時的阻力大小
allowsRotation(容許旋轉):這個屬性頗有意思,它在真實的物理世界沒有對應的模型。 設置這個屬性爲 NO 物體就徹底不會轉動(不管施加多大的轉動力)。
EmilyWang.