最近產(chǎn)品提了個需求(電商的APP-兩鮮)拣宰,需要在APP背景加上幾個水果圖案在那里無規(guī)則緩慢游蕩党涕。。巡社。模仿 天天果園 APP的膛堤。好吧,那我就在網(wǎng)上找了很多文章晌该,總結(jié)一下寫個demo肥荔。效果如下:
這里用到的是UIDynamic這個類。
UIDynamic簡介
-
一气笙、簡介
- UIDynamic是從iOS 7開始引入的一種新技術(shù)次企,隸屬于UIKit框架
可以認為是一種物理引擎,能模擬和仿真現(xiàn)實生活中的物理現(xiàn)象如:重力潜圃、彈性碰撞等現(xiàn)象 - 廣泛用于游戲開發(fā),經(jīng)典成功案例是“憤怒的小鳥”讓開發(fā)人員可以在遠離物理學(xué)公式的情況下舟茶,實現(xiàn)炫酷的物理仿真效果提高了游戲開發(fā)效率谭期,產(chǎn)生更多優(yōu)秀好玩的物理仿真游戲。
- 注意:UIKit動力學(xué)的引入吧凉,并不是為了替代CA或者UIView動畫隧出,在絕大多數(shù)情況下CA或者UIView動畫仍然是最有方案,只有在需要引入逼真的交互設(shè)計的時候阀捅,才需要使用UIKit動力學(xué)它是作為現(xiàn)有交互設(shè)計和實現(xiàn)的一種補充胀瞪。
- UIDynamic是從iOS 7開始引入的一種新技術(shù)次企,隸屬于UIKit框架
-
UIDynamic中的三個重要概念
- Dynamic Animator:動畫者,為動力學(xué)元素提供物理學(xué)相關(guān)的能力及動畫饲鄙,同時為這些元素提供相關(guān)的上下文凄诞,是動力學(xué)元素與底層iOS物理引擎之間的中介,將Behavior對象添加到Animator即可實現(xiàn)動力仿真忍级。
- Dynamic Animator Item:動力學(xué)元素帆谍,是任何遵守了UIDynamic協(xié)議的對象,從iOS7開始轴咱,UIView和UICollectionViewLayoutAttributes默認實現(xiàn)協(xié)議汛蝙,如果自定義對象實現(xiàn)了該協(xié)議,即可通過Dynamic Animator實現(xiàn)物理仿真朴肺。
- UIDynamicBehavior:仿真行為窖剑,是動力學(xué)行為的父類,基本的動力學(xué)行為類UIGravityBehavior戈稿、UICollisionBehavior西土、UIAttachmentBehavior、UISnapBehavior器瘪、UIPushbehavior以及UIDynamicItemBehavior均繼承自該父類翠储。
-
物理仿真行為
UIGravityBehavior:重力行為
UICollisionBehavior:碰撞行為
UISnapBehavior:捕捉行為
UIPushBehavior:推動行為
UIAttachmentBehavior:附著行為
UIDynamicItemBehavior:動力元素行為(可以設(shè)置動畫元素的屬性绘雁,比如摩擦力,密度援所,彈性等等)
代碼
因為項目需求在這里就不寫重力行為庐舟,只需要推動行為和碰撞行為
NSMutableArray *array =[NSMutableArray array];
for (int i = 0; i<5; i++) {
srand((unsigned int)time(NULL));
UIView *vienw = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
vienw.backgroundColor = [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1]; //隨機色
[self.view addSubview:vienw];
[array addObject:vienw];
/*
給每個物理元素(vienw)添加一個不同角度的推力
*/
UIPushBehavior *gravityBehavior = [[UIPushBehavior alloc]initWithItems:@[vienw] mode:UIPushBehaviorModeInstantaneous];
//創(chuàng)建一個推力
//[gravityBehavior addItem:vienw];
gravityBehavior.angle = i *0.15; //設(shè)置推力的角度
//加速度
gravityBehavior.magnitude = 0.1; //加速度,越大力越大
gravityBehavior.active = YES; //激活力的作用
[self.animater addBehavior:gravityBehavior];//加入仿真器
}
UIDynamicItemBehavior * itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:array]; //將所有物理元素添加動力元素行為
itemBehavior.elasticity = 1; //設(shè)置彈性越大彈的越猛(筆者試了幾次住拭,發(fā)現(xiàn)1是原來的力氣反彈挪略,比1大會彈回去加力,比1小會衰減)
itemBehavior.friction = 0; // 磨擦力
itemBehavior.density = 0.1; //密度滔岳,杠娱,密度*體積等于質(zhì)量 物理元素越大密度越大,越難推動
itemBehavior.resistance = 0; // 抗阻力 0~CGFLOAT_MAX 谱煤,阻礙原有所加注的行為(如本來是重力自由落體行為摊求,則阻礙其下落,阻礙程度根據(jù)其值來決定)
itemBehavior.allowsRotation = NO;是否允許旋轉(zhuǎn)
[self.animater addBehavior:itemBehavior];
/*
添加碰撞行為
*/
UICollisionBehavior *cont = [[UICollisionBehavior alloc]initWithItems:array];
cont.collisionDelegate = self;//(如果需要截獲碰撞發(fā)生時的事件的話可以使用)
cont.collisionMode = UICollisionBehaviorModeEverything;
//枚舉:碰撞所有物體(包括邊界 和 物理元素:該物理元素必須是該行為的元素數(shù)組刘离,如果給每一個vienw實例化一個碰撞行為的話室叉,他們之間是不會發(fā)生碰撞的)
cont.translatesReferenceBoundsIntoBoundary = YES; //是否設(shè)置參照物為邊界
//[cont setTranslatesReferenceBoundsIntoBoundaryWithInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; //設(shè)置參照物為邊界 ,并限制了邊界范圍;
// [cont addBoundaryWithIdentifier:@"conditon1" fromPoint:CGPointMake(0, 0) toPoint:CGPointMake(self.view.frame.size.width, self.view.frame.size.height)];設(shè)置兩個點之間的連線為邊界
[self.animater addBehavior:cont];
- (UIDynamicAnimator*)animater{
if (!_animater) {
//仿真器實例化
_animater = [[UIDynamicAnimator alloc]initWithReferenceView:self.view]; //參考視圖
}
return _animater;
更多精彩請參考
http://www.reibang.com/p/e096d2dda478