UIKit Dynamics 是一個被融入到 UIKit 框架中的物理引擎。
web
最爲核心的使用思想能夠用下圖來展示:框架
爲了更好地描述他們的關係,我對各個對象進行了適當的比喻。ide
UIDynamicAnimator 實例比如動態效果的導演。在該實例進行初始化的過程當中,它須要知道這個動態效果在哪兒被執行,也就行演員視圖的父視圖,隨後咱們會建立不少的行爲(能夠理解成是劇本),這些行爲是爲演員視圖準備的,同時,也要求被導演知道。演員視圖產生的行爲會獲取父視圖的邊界(bounds)。spa
總結以下:代理
導演 須要獲取 劇本(behaviour) 和 場景(reference view); 劇本 須要獲取 它對應的 演員 (View). 劇本 將會根據實際的場景,進行(參數)對應。code
實例演示:orm
// 在 -(void) viewDidLoad 方法中 // 1. 建立演員視圖而且添加到父視圖上 - 一個箱子 - (void) viewDidLoad { [super viewDidLoad]; UIView *box = [[UIView alloc] initWithFrame:CGRectMake(100, 20, 50, 50)]; box.backgroundColor = [UIColor blueColor]; [self.view addSubView: box]; } // self.view 就至關於這個效果的實施場景了~ // 在 viewController.m 文件中聲明私有變量 @interface ViewController () { UIDynamicAnimator *animator; UIGravityBehavior *gravity; } @end // 在 -(void) viewDidLoad 方法中 // 建立實例,而且進行關聯 和 添加 animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; gravity = [[UIGravityBehavior alloc] initWithItems:@[box]]; // 添加 [animator addBehavior: gravity]; // 如今基本上實現了 box 的自由落體效果 // 爲了避免讓 box 落到窗口的外面,咱們繼續添加一個 行爲-產生碰撞效果 @interface ViewController () { ..... ..... UICollisionBehavior *collision; } @end - (void) viewDidLoad { collision = [[UICollisionBehavior alloc] initWithItems:@[box]]; // 以 self.view 的 bounds 最爲 邊界 collision.translatesReferenceBoundsIntoBoundary = YES; [animator addBehavior: collision]; // 此時, box 掉落至屏幕邊界的時候,就會回彈,直至靜止下來 // 以後,在碰撞行爲上新增一個邊界 [collision addBoundaryWithIdentifier:@"barrier" fromPoint:CGPointMake( 0 , 400) toPoint:CGPointMake( 320, 400)]; } // 想在 演員視圖進行碰撞動做時,獲取通知,則聽從 代理便可 @interface ViewController () <UICollisionBehaviorDelegate> { } - (void) viewDidLoad { collision.delegate = self; } #pragma mark #pragma mark - UICollisionBehaviorDelegate - (void) collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier atPoint:(CGPoint)p { // 演員視圖每次發生碰撞動做時,輸出 NSLog(@" Collision occurred!"); } // 配置 導演視圖的動做屬性 讓其具備更大的彈性 // viewDidLoad() 中 UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[box]]; itemBehavior.elasticity = 0.7; [animator addBehavior: itemBehavior];
Nov 6, 2014對象