iOS 7 新特性 - UIKit Dynamics

UIKit Dynamics 是一個被融入到 UIKit 框架中的物理引擎。
web

最爲核心的使用思想能夠用下圖來展示:框架

image

爲了更好地描述他們的關係,我對各個對象進行了適當的比喻。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對象

相關文章
相關標籤/搜索