iOS 7 新特性 - UIKit Dynamics

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

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

image

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

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


转载于:https://my.oschina.net/herbert77/blog/500623

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值