IOS UIDynamic仿物理引擎-浮動碰撞效果

最近產(chǎn)品提了個需求(電商的APP-兩鮮)拣宰,需要在APP背景加上幾個水果圖案在那里無規(guī)則緩慢游蕩党涕。。巡社。模仿 天天果園 APP的膛堤。好吧,那我就在網(wǎng)上找了很多文章晌该,總結(jié)一下寫個demo肥荔。效果如下:

Mou icon

這里用到的是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中的三個重要概念

    • 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市硫惕,隨后出現(xiàn)的幾起案子茧痕,更是在濱河造成了極大的恐慌,老刑警劉巖恼除,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踪旷,死亡現(xiàn)場離奇詭異,居然都是意外死亡豁辉,警方通過查閱死者的電腦和手機令野,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秋忙,“玉大人彩掐,你說我怎么就攤上這事』易罚” “怎么了堵幽?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弹澎。 經(jīng)常有香客問我朴下,道長,這世上最難降的妖魔是什么苦蒿? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任殴胧,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘团滥。我一直安慰自己竿屹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布灸姊。 她就那樣靜靜地躺著拱燃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪力惯。 梳的紋絲不亂的頭發(fā)上碗誉,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音父晶,去河邊找鬼哮缺。 笑死,一個胖子當(dāng)著我的面吹牛甲喝,可吹牛的內(nèi)容都是我干的尝苇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼俺猿,長吁一口氣:“原來是場噩夢啊……” “哼茎匠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起押袍,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凯肋,沒想到半個月后谊惭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡侮东,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年圈盔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悄雅。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡驱敲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宽闲,到底是詐尸還是另有隱情众眨,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布容诬,位于F島的核電站娩梨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏览徒。R本人自食惡果不足惜狈定,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纽什,春花似錦措嵌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饺藤,卻和暖如春包斑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涕俗。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工罗丰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人再姑。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓萌抵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親元镀。 傳聞我的和親對象是個殘疾皇子绍填,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本文中所有代碼演示均有GitHub源碼,點擊下載 UIDynamic簡介 簡介:UIKit動力學(xué)最大的特點是將現(xiàn)實...
    si1ence閱讀 10,212評論 8 79
  • ————————————【 iOS—UIDynamic 】————————————— 一栖疑、簡單介紹 1.什么是UI...
    北辰青閱讀 1,614評論 0 1
  • 目錄 ** UIView 動畫 ** ** Core Animation ** ** FaceBook POP動畫...
    方向_4d0d閱讀 1,594評論 0 3
  • 1.1UIDynamic概述 UIKit動力學(xué)(Dynamic)最大的特點是將現(xiàn)實世界中動力驅(qū)動的動畫引入了UIK...
    劉2傻閱讀 324評論 0 0
  • 文/李勝梅 01 女兒快到入園的年齡了遇革,焦慮已經(jīng)提前來了卿闹,不是她,是我萝快。 她會哭鬧锻霎,會在家門口眼淚汪汪地說我不要...
    李勝梅閱讀 1,772評論 9 22