UIKit Dynamics 是一个被融入到 UIKit 框架中的物理引擎。
最为核心的使用思想可以用下图来展现:
为了更好地描述他们的关系,我对各个对象进行了适当的比喻。
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