1. 程式人生 > >iOS-UIDynamic物理模擬-重力、碰撞

iOS-UIDynamic物理模擬-重力、碰撞

UIDynamic

UIDynamic是從iOS 7開始引入的一種新技術,隸屬於UIKit框架可以認為是一種物理引擎,能模擬和模擬現實生活中的物理現象如:重力、彈性碰撞等現象

任何遵守了UIDynamicItem協議的物件
UIView預設已經遵守了UIDynamicItem協議,因此任何UI控制元件都能做物理模擬
UICollectionViewLayoutAttributes類預設也遵守UIDynamicItem協議

這裡寫圖片描述

接下來我們試著用程式碼來實現UI控制元件的模擬行為,做一些有趣的實驗,說一說具體實現的步驟,做的東西比較簡單,希望對大家有所幫助.

1首先我們現在storyboard新增兩個UIView控制元件,在控制器中拖線進行關聯,便於訪問兩個UIView物件

@property (weak, nonatomic) IBOutlet UIView *testViewOne;

@property (weak, nonatomic) IBOutlet UIView *testViewTwo;

2.要給兩個控制元件新增模擬行為首先得建立一個物理模擬器物件

UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

self.animator = animator;

3.接下來建立想要的物理模擬行為(如重力、碰撞、附著等)

基本步驟:

1.建立模擬行為物件(建立的時候,會指定模擬行為新增給那些元素/控制元件)

2.設定模擬物件的引數(或是屬性)

3.將物理模擬行為新增到物理模擬器中

//建立重力模擬行為

UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.testViewOne, self.testViewTwo]];

//設定重力行為的屬性(引數)

gravity.gravityDirection = CGVectorMake(0, 1); // 方向

gravity.magnitude = 1; //加速度
//建立碰撞 UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.testViewOne, self.testViewTwo]]; //設定碰撞邊界 collision.translatesReferenceBoundsIntoBoundary = YES; /**新增自定義的邊界**/ //建立路徑 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(150, 350, 300, 140)]; //新增邊界 [collision addBoundaryWithIdentifier:@"customBoundary" forPath:path]; //檢測碰轉要設定代理 collision.collisionDelegate = self; //設定碰轉的模式 //UICollisionBehaviorModeItems 只和物體碰撞 //UICollisionBehaviorModeBoundaries 只和邊界碰撞 //UICollisionBehaviorModeEverything 物體碰撞和邊界碰撞 collision.collisionMode = UICollisionBehaviorModeEverything;

當然為了達到良好的模擬行為效果,也可設定元素/控制元件的自身的引數設定

//設定檢視的輔助行為(本身引數 彈性係數 阻力等)

//    elasticity; // Usually between 0 (inelastic) and 1 (collide elastically)  彈性係數

//    friction; // 0 being no friction between objects slide along each other  摩擦力

//    density; // 1 by default                                                  密度

//    resistance; // 0: no velocity damping                                    阻力

//    angularResistance; // 0: no angular velocity damping

//    allowsRotation; // force an item to never rotate                          是否允許旋轉

UIDynamicItemBehavior *item = [[UIDynamicItemBehavior alloc] initWithItems:@[self.testViewOne, self.testViewTwo]];

item.elasticity = 0.9;

item.friction = 0;

item.density = 1;

item.resistance = 0.3;

item.angularResistance = 0.6;

//將模擬行為新增到模擬器中

[animator addBehavior:gravity];

[animator addBehavior:collision];

[animator addBehavior:item];

當然,物理模擬中還提供了代理方法方便開發者在執行模擬動畫的同時做一些其他的操作

//物體和物體開始碰撞

- (void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id)item1 withItem:(id)item2 atPoint:(CGPoint)p {

UIView *viewOne = (UIView *)item1;

UIView *viewTwo = (UIView *)item2;

viewOne.backgroundColor = [self randomColor];

viewTwo.backgroundColor = [self randomColor];

self.view.backgroundColor = [self randomColor];

}
//物體和物體結束碰撞

- (void)collisionBehavior:(UICollisionBehavior *)behavior endedContactForItem:(id)item1 withItem:(id)item2 {

//自己想要的操作

}
//物體和邊界開始碰撞

- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id)item withBoundaryIdentifier:(nullable id)identifier atPoint:(CGPoint)p {

UIView *view = (UIView *)item;

view.backgroundColor = [self randomColor];

self.view.backgroundColor = [self randomColor];

}
//物體和邊界結束碰撞

- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id)item withBoundaryIdentifier:(nullable id)identifier {

//自己想要的操作

}

感興趣的朋友可以試著做一些有趣的效果,物理模擬可下載原始碼

相關推薦

iOS-UIDynamic物理模擬-重力碰撞

UIDynamic UIDynamic是從iOS 7開始引入的一種新技術,隸屬於UIKit框架可以認為是一種物理引擎,能模擬和模擬現實生活中的物理現象如:重力、彈性碰撞等現象 任何遵守了UIDynamicItem協議的物件 UIView預設已經遵守了UID

iOS-UIDynamic物理模擬-附著-UIAttachmentBehavior

附著-UIAttachmentBehavior 物理模擬中的附著行為的實現同之前’捕捉’步驟 1.建立物理模擬器物件 2.建立物理模擬行為物件 3.設定物理模擬行為的屬性 4.將模擬行為新增到物理模擬器中 @property (weak,

iOSUIDynamic物理模擬詳解

UIDynamic簡介 簡介: UIKit動力學最大的特點是將現實世界動力驅動的動畫引入了UIKit,比如動力,鉸鏈連線,碰撞,懸掛等效果,即將2D物理引擎引入了UIKit。注意:UIKit動力學的引入,並不是為了替代CA或者UIView動畫,在絕大多數情況下CA或

iOS開發拓展篇—UIDynamic(重力行為+碰撞檢測)

一、重力行為 說明:給定重力方向、加速度,讓物體朝著重力方向掉落 1.方法 (1)UIGravityBehavior的初始化   - (instancetype)initWithItems:(NSArray *)items;     item引數 :裡面存放著物

無人機飛行控制演算法控制律設計軟體與半物理模擬

工業級多功能可程式設計飛行控制系統 專業的圖形化控制律設計軟體 靈活強大的工程應用開發平臺 DSP處理器及高精度感測器 自定義高速遙測資料採集 嵌入式半物理模擬系統 豐富的使用者裝置介面 適用於固定翼、旋翼機、特殊飛行器、車船艇、機器人、雲臺等 概 

【培訓】結構振動衝擊碰撞強度動力優化振動疲勞計算與振動臺試驗模擬

一、課程背景: 本課程基於ANSYS經典和Workbench平臺,針對各類結構的振動、衝擊、碰撞強度問題、動力優化問題、振動疲勞問題和振動臺試驗模擬問題,給出有效的數值計算方案,並對多點激勵問題、大質量法數值模擬技術等相關高階計算技術進行探討。課程全面系統的講解各類動力學問題的計算原理、Work

unity | 新增物理身體Rigidbody自由落體相互碰撞靜態剛體

節點新增Rigidbody後,即擁有物理的身體(剛體),接受重力影響,但是還沒有形狀,所以不能碰撞。 添加了collider碰撞元件後才擁有物理形狀,開始接受空間剛體碰撞。 然後設定靜態剛體、例如地面就是靜態剛體 is kinematic表示是否可以運動

iOS物理模擬動畫

物理模擬行為(Dynamic Behavior) 執行怎樣的物理模擬效果?怎樣的動畫效果? UIDynamic提供了以下幾種物理模擬行為: UIGravityBehavior:重力行為UICollisionBehavior:碰撞行為UISnapBehavior:

cocos2dx 3.x 物理引擎接觸檢測掩碼碰撞掩碼和類別掩碼問題解析

言簡意賅,物體的類別掩碼CategoryBitMask和物體的接觸測試掩碼ContactTestBitmask邏輯“與”運算結果非零,則觸發EventListenerPhysicsContact事件監聽器,物體的類別掩碼CategoryBitMask和物體

結構流體熱分析物理場耦合電磁模擬硬體配置推薦2018

(一)有限元分析介紹有限元分析(FEA)藉助高效能運算機工具,用“數值近似”和“離散化”方法對真實物理系統(幾何和載荷工況)進行模擬,如求解結構、熱傳導、電磁場、流體力學等連續性問題。有限元法在工程設計和科研領域得到了廣泛的應用,已經成為解決複雜工程分析計算問題的有效途徑,從

ios-UIDynamicAnimator(物理模擬動畫)

實現物理模擬的效果 滑鼠點選處,小球彈到那裡 #import "ViewController.h" @interface ViewController () @property(nonatomic

iOS_實現物理模擬中的圓形碰撞

由於UI控制元件都矩形的,即使進行對layer層進行,直接對控制元件進行圓形切割,在進行物理模擬時,控制元件依舊是按照矩形進行物理模擬。 通過檢視,我們可以發現所有的UIView內都包含UIDynam

基於Babylon.js編寫宇宙飛船模擬程式1——程式基礎結構物理引擎使用三維羅盤

計劃做一個宇宙飛船模擬程式,首先做一些技術準備。 可以訪問https://ljzc002.github.io/test/Spacetest/HTML/PAGE/spacetestwp2.html檢視測試場景,按住qe鍵可以左右傾斜相機。可以在https://github.com/ljzc002/ljzc

IOS 藍牙(GameKitCore Bluetooth)

one col logs nali param pla star close equal GameKit的藍牙開發註意 ● 只能用於iOS設備之間的連接 ● 只能用於同一個應用程序之間的連接 ● 最好別利用藍牙發送比較大的數據 iOS中藍牙的

iOS獲取WIFI的IP子網掩碼,以及域名轉IP

dsta port string cti ring nsstring iphone mil clu 獲取WIFI需要的頭文件: #import "GetCurrentIP.h" #import <ifaddrs.h> #import <arpa/in

IOS 視頻分解圖片圖片合成視頻

ide codec 相對 city for trac ati 註意 dap 在IOS視頻處理中,視頻分解圖片和圖片合成視頻是IOS視頻處理中常常遇到的問題。這篇博客就這兩個部分對IOS視頻圖像的相互轉換做一下分析。 (1)視頻分解圖片 這裏視頻分解圖片使用的是A

Linux查看物理CPU個數核數邏輯CPU個數

-c physical 邏輯 型號 物理 log bar min tool # 總核數 = 物理CPU個數 X 每顆物理CPU的核數 # 總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超線程數 # 查看物理CPU個數 cat /pro

iOS Socket 整理以及CocoaAsyncSocketSRWebSocket源碼解析(一)

ict sad endif alias reat 定位 ava 第一個 type 寫在準備動手的時候: Socket通訊在iOS中也是很常見,自己最近也一直在學習Telegram這個開源項目,Telegram就是在Socket的基礎上做的即時通訊,這個

iOS百思不得姐ARKit旋轉動畫立體相冊源碼等

問題 安全問題 3d立體 mem thread con 中學 operation 概率 iOS精選源碼 自定義視圖彈出實現方案 仿寫百思不得姐 ARKit,距離感應,AR尺子 iOS傳感器集錦 AR太陽系,動畫與光線

物理模擬(基於定時器的動畫 11.2)

步長 call 可選 es2017 containe 屏幕 crate 建模 問題 物理模擬 即使使用了基於定時器的動畫來復制第10章中關鍵幀的行為,但還是會有一些本質上的區別:在關鍵幀的實現中,我們提前計算了所有幀,但是在新的解決方案中,我們實際上實在按需要在計算。意義在