因 : 無聊看到開發(fā)群里說到“掌上英雄聯(lián)盟”重力感應(yīng)粒子碰撞效果,邊新生想法動(dòng)手實(shí)現(xiàn)一下??????
>>>>>>>>>>首先仔細(xì)觀察效果
>>>>>>>>>>個(gè)人認(rèn)為有2種實(shí)現(xiàn)方式
1 代碼 UIDynamic + CoreMotion 就可以實(shí)現(xiàn)了
2 底層放一個(gè)webView,通過透明網(wǎng)頁形式展現(xiàn)(個(gè)人猜測(cè))
>>>>>>>>>> 代碼實(shí)現(xiàn)須知
1 了解重力感應(yīng)機(jī)制
{
通過手機(jī)陀螺儀的加速度判斷(自行百度了解弄企,資料很多)
}
2 了解UIDynamic(物理碰撞)機(jī)制
{
1 重力行為(UIGravityBehavior),
2 推動(dòng)行為(UIPushBehavior),
3 物體的屬性包括彈性等(UIDynamicItemBehavior),
4邊緣范圍(UICollisionBehavior)
}(自行百度了解囱怕,資料很多)
>>>>>>>>>> 主要代碼
1 重力感應(yīng)
if ([self.mManager isAccelerometerAvailable] == YES) {
//回調(diào)會(huì)一直調(diào)用,建議獲取到就調(diào)用下面的停止方法好啰,需要再重新開始,當(dāng)然如果需求是實(shí)時(shí)不間斷的話可以等離開頁面之后再stop
[self.mManager setAccelerometerUpdateInterval:updateInterval];
[self.mManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error)
{
double x = accelerometerData.acceleration.x;
double y = accelerometerData.acceleration.y;
if (fabs(y) >= fabs(x))
{
if (y >= 0){
NSLog(@"Down");
}
else{
NSLog(@"Portrait");
}
}
else
{
if (x >= 0){
NSLog(@"Right");
}
else{
//Left
}
}
// 1. 計(jì)算偏移量
CGPoint offset = CGPointMake(accelerometerData.acceleration.x,-accelerometerData.acceleration.y);
// 2. 計(jì)算角度
CGFloat angle = atan2(offset.y, offset.x);
// 3. 計(jì)算距離
CGFloat distance = hypot(offset.y, offset.x);
// 4. 設(shè)置推動(dòng)的大小爆惧、角度
self.baseView.push.magnitude = distance;
self.baseView.push.angle = angle;
// 5. 使單次推行為有效
self.baseView.push.active = YES;
}];
}
2 UIDynamic
// 初始化仿真者
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self];
self.boxView.center = CGPointMake(190, 0);
// 1. 添加重力行為
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.boxView]];
[self.animator addBehavior:gravity];
// 2. 邊緣檢測(cè)
// 如果把紅色view 也加邊緣檢測(cè),則碰撞后紅色View 也會(huì)被碰掉侄旬,因此要手動(dòng)添加邊界
UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.boxView]];
// 讓碰撞的行為生效
collision.translatesReferenceBoundsIntoBoundary = YES;
collision.collisionDelegate = self;
// 5. 物體的屬性行為
UIDynamicItemBehavior *item = [[UIDynamicItemBehavior alloc] initWithItems:@[self.boxView,self.boxViewOther,self.boxView3,self.boxView4,self.boxView5]];
// 設(shè)置物體彈性蚌本,振幅
item.elasticity = 0.5;
[self.animator addBehavior:item];
// 設(shè)置物體推動(dòng)
self.push = [[UIPushBehavior alloc] initWithItems:@[self.boxView];
>>>>>>>>>> 最終效果
>>>>>>>>>>視頻轉(zhuǎn)gif有點(diǎn)問題,????
>>>>>>>>>>附上github地址
https://github.com/wutao66/UIDynamicTest