ios之小应用-重力感应
重力感应代码:
#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
下面是模拟器截图,正常情况是真机去测试的,因为水平仪模拟器是没办法测的。