本节书摘来自异步社区《iOS 6高级开发手册(第4版)》一书中的第1章,第1.5节秘诀:使用加速能力“向上”定位,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.5 秘诀:使用加速能力“向上”定位
iOS 6高级开发手册(第4版)
iPhone提供了3个机载传感器,用于沿着iPhone的3根相互垂直的轴(左/右(x轴)、上/下(y轴)和前/后(z轴))度量加速能力。这些值指示作用于iPhone的力,它们来自重力和用户移动。可以通过在脑袋周围晃动iPhone(向心力)或者把它从高楼上投下(*落体)来获得某种净力反馈。当然,如果不幸摔坏了,它也许不能取回这类数据。
要向iPhone加速计更新订阅某个对象,可把它设置委托。设置为委托的对象必须实现UIAccelerometerDelegate协议:
[[UIAccelerometer sharedAccelerometer] setDelegate:self]
在指定时,委托将会接收accelerometer:didAccelerate:回调消息,可以跟踪并对其做出响应。发送给委托方法的UIAcceleration结构包含x轴、y轴和z轴的浮点值,每个值的范围为—1.0~1.0:
float x = acceleration.x;
float y = acceleration.y;
float z = acceleration.z;
秘诀1-3使用这些值来帮助确定“向上”的方向。它会计算x和y加速度向量之间的反正切值,返回垂直向上的偏移角度。当接收到新的加速消息时,秘诀将会利用其箭头图片(在图1-1中可以看到它)旋转UIImageView实例,以指向上方。对用户动作的实时响应确保箭头会继续指向上方,而无论用户怎样改变手机的方向。
秘诀1-3 捕获加速事件
- (void)accelerometer:(UIAccelerometer *)accelerometer
didAccelerate:(UIAcceleration *)acceleration
{
// Determine up from the x and y acceleration components
float xx = -acceleration.x;
float yy = acceleration.y;
float angle = atan2(yy, xx);
[arrow setTransform:
CGAffineTransformMakeRotation(angle)];
}
- (void) viewDidLoad
{
// Initialize the delegate to start catching accelerometer events
[UIAccelerometer sharedAccelerometer].delegate = self;
}
图1-1 使用x和y方向的力向量,通过执行一个反正切函数,利用一点数学计算即可恢复“向上”的方向。在这个示例中,无论用户怎样改变iPhone的方向,箭头总会指向上方