重力感应代码:
#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
//创建管理对象 水平仪
@property (nonatomic, strong) CMMotionManager *manager;
//创建动画对象
@property (nonatomic, strong) UIDynamicAnimator *dyanimat;
//重力
@property (nonatomic, strong) UIGravityBehavior *gravit;
//碰撞
@property (nonatomic, strong) UICollisionBehavior *collision;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark - 实例化对象
- (CMMotionManager *)manager {
if (_manager == nil) {
_manager = [[CMMotionManager alloc] init];
_manager.deviceMotionUpdateInterval = 0.01;
}
return _manager;
}
- (UIDynamicAnimator *)dyanimat {
if (_dyanimat == nil) {
_dyanimat = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
}
return _dyanimat;
}
- (UIGravityBehavior *)gravit {
if (_gravit == nil) {
_gravit = [[UIGravityBehavior alloc] init];
}
return _gravit;
}
- (UICollisionBehavior *)collision {
if (_collision == nil) {
_collision = [[UICollisionBehavior alloc] init];
_collision.translatesReferenceBoundsIntoBoundary = YES;
}
return _collision;
}
#pragma mark - 给对象添加动画
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//最多可添加50个
if (self.view.subviews.count >= 50) {
NSLog(@"已到上限");
return;
}
//获取手指的点
UITouch *touch = touches.anyObject;
CGPoint point = [touch locationInView:self.view];
//创建及切圆角
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
view.layer.cornerRadius = 10;
view.layer.masksToBounds = YES;
//手指的点就是view的中心点
view.center = point;
//随机颜色
view.backgroundColor = [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1];
[self.view addSubview:view];
//将对象添加到动画里
[self.dyanimat addBehavior:self.gravit];
[self.dyanimat addBehavior:self.collision];
// 为view添加重力效果
[self.gravit addItem:view];
// 为view添加碰撞效果
[self.collision addItem:view];
// 开始监听
[self.manager startDeviceMotionUpdatesToQueue:NSOperationQueue.mainQueue withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error) {
// 设置重力方向
self.gravit.gravityDirection = CGVectorMake(motion.gravity.x, -motion.gravity.y);
}];
//打印添加的控件的个数
NSLog(@"%zd - %@", self.view.subviews.count, view);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
下面是模拟器截图,正常情况是真机去测试的,因为水平仪模拟器是没办法测的。