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

