本节书摘来自异步社区《iOS 6高级开发手册(第4版)》一书中的第1章,第1.11节秘诀:获取和使用设备姿势,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.11 秘诀:获取和使用设备姿势
iOS 6高级开发手册(第4版)
设想有一部iPad放在桌子上。iPad上显示了一幅图像,可以弯曲并查看它。现在,设想旋转那个iPad,就像它平放在桌子上一样,但是当iPad移动时,图像不会移动。它保持与周围的世界完美对齐。无论怎样旋转iPad,图像都不会随着视图更新而“移动”,以平衡物理运动。这就是秘诀1-7的工作方式,利用设备的机载陀螺仪(这是必需的),使这个秘诀工作。
无论怎样握持设备,图像都会调整。除了这种水平操作,还可以拾起设备并在空间中定位它的方向。如果在手中翻转设备并查看它,就会看到图像的颠倒的“底部”。还可以沿着两根轴倾斜它:一根是从Home按钮指向照相机,另一根则从照相机与Home按钮的中点开始穿过iPad的表面。还有一根轴,它是你最先探讨过的,从设备的中间开始,指向设备上方的空间,并且穿过它下面的中点。在操纵设备时,图像会做出响应,在那个iPad内创建一个可视化的静态世界。
秘诀1-7显示了如何利用少量简单的几何变换来执行该操作。它建立了一个运动管理器,订阅设备运动更新,然后基于运动管理器返回的摇晃、前倾和左右摇摆的角度应用图像变换。
秘诀1-7 使用设备运动更新修正空间里的图像
- (void) shutDownMotionManager
{
NSLog(@"Shutting down motion manager");
[motionManager stopDeviceMotionUpdates];
motionManager = nil;
}
- (void) establishMotionManager
{
if (motionManager)
[self shutDownMotionManager];
NSLog(@"Establishing motion manager");
// Establish the motion manager
motionManager = [[CMMotionManager alloc] init];
if (motionManager.deviceMotionAvailable)
[motionManager
startDeviceMotionUpdatesToQueue:
[NSOperationQueue currentQueue]
withHandler: ^(CMDeviceMotion *motion, NSError *error) {
CATransform3D transform;
transform = CATransform3DMakeRotation(
motion.attitude.pitch, 1, 0, 0);
transform = CATransform3DRotate(transform,
motion.attitude.roll, 0, 1, 0);
transform = CATransform3DRotate(transform,
motion.attitude.yaw, 0, 0, 1);
imageView.layer.transform = transform;
}];
}