什么是UIDynamic
UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架
可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象
重力、弹性碰撞等现象
物理引擎的价值
广泛用于游戏开发,经典成功案例是“愤怒的小鸟”
让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果
提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏
知名的2D物理引擎
Box2d
UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架
可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象
重力、弹性碰撞等现象
物理引擎的价值
广泛用于游戏开发,经典成功案例是“愤怒的小鸟”
让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果
提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏
知名的2D物理引擎
Box2d
Chipmunk
使用步骤:
要想使用
UIDynamic
来实现物理仿真效果,大致的步骤如下
创建一个
物理仿真器
(顺便设置仿真范围
)
创建相应的
物理仿真行为
(顺便添加
物理仿真元素
)
将
物理仿真行为
添加到
物理仿真器
中
à
开始仿真
//
// ViewController.m
// UIDynamic
#import "ViewController.h"
@interface ViewController ()
/** 仿真器 */
@property (nonatomic, strong) UIDynamicAnimator *animator;
@property (weak, nonatomic) IBOutlet UIView *redView;
@property (weak, nonatomic) IBOutlet UIView *blueView;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// -1.移除仿真行为
[self.animator removeAllBehaviors];
// 0.获取用户点击的点
CGPoint point = [[touches anyObject] locationInView:self.view];
// 1.创建捕捉行为
UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:self.redView snapToPoint:point];
// 1.1.设置阻力系数(0~1)
snap.damping = 1;
// 2.将捕捉行为添加到仿真器中(一个仿真器中只能存在一个捕捉行为)
[self.animator addBehavior:snap];
}
- (void)gravityAndCollision
{
// 1.创建仿真行为,并且指定仿真元素
// 1.1.重力行为
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.redView]];
// 1.2.设置重力的方向(默认角度M_PI_2)
// gravity.angle = 0;
// 1.3.设置重力的大小
// gravity.magnitude = 10.0;
// 1.4.设置重力的向量值
// gravity.gravityDirection = CGVectorMake(1.0, 3.0);
// 1.2.碰撞行为
UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.redView, self.blueView]];
// 1.2.1.设置碰撞边界
collision.translatesReferenceBoundsIntoBoundary = YES;
// 1.2.2.给碰撞行为添加一个边界
CGPoint startPoint = CGPointMake(0, self.view.bounds.size.height * 2 / 3);
CGPoint endPoint = CGPointMake(self.view.bounds.size.width, self.view.bounds.size.height * 2 / 3);
[collision addBoundaryWithIdentifier:@"lineBoundary" fromPoint:startPoint toPoint:endPoint];
// [collision removeBoundaryWithIdentifier:@"lineBoundary"];
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.width)];
[collision addBoundaryWithIdentifier:@"bezierPath" forPath:bezierPath];
// 2.将仿真行为添加到仿真器中
[self.animator addBehavior:gravity];
[self.animator addBehavior:collision];
}
#pragma mark - 懒加载代码
- (UIDynamicAnimator *)animator
{
if (_animator == nil) {
// 创建仿真器,并且指定仿真范围
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
}
return _animator;
}
@end