iOS 7 新特性 - UIKit Dynamics

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

最为核心的使用思想可以用下图来展现:

iOS 7 新特性 - UIKit Dynamics_第1张图片

为了更好地描述他们的关系,我对各个对象进行了适当的比喻。

UIDynamicAnimator 实例好比动态效果的导演。在该实例进行初始化的过程中,它需要知道这个动态效果在哪儿被执行,也就行演员视图的父视图,随后我们会创建很多的行为(可以理解成是剧本),这些行为是为演员视图准备的,同时,也要求被导演知道。演员视图产生的行为会获取父视图的边界(bounds)。

总结如下:

导演 需要获取 剧本(behaviour) 和 场景(reference view); 剧本 需要获取 它对应的 演员 (View). 剧本 将会根据实际的场景,进行(参数)对应。

实例演示:

        //  在 -(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


你可能感兴趣的:(ios,UIKit,7,Dynamics)