重力感應代碼:
#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
下面是模擬器截圖,正常情況是真機去測試的,因為水平儀模擬器是沒辦法測的。