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对象