把前面已经下载的给以继续更新,前面的大家看到的就继续更新吧热心网友自发组织翻译目录写在前面目录第章核心运动介绍检测加速度计的可用性问题方案讨论参考检测陀螺仪的可用性问题方案讨论参考获取加速器的数据问题方案讨论参考检测设备的摇晃问题方案讨论参考获取陀螺仪的数据问题<方案论参考热心网友自发组织翻译版本年月日热心网友自发组织翻译第18章核心运动1.0.介绍设备,例如和通常会配备加速度计硬件。一些设备也可能会配备陀螺仪,例如应用程序中,尝试使用加速度计或者陀螺仪之前必须先检测应川程序所运行的设备的传感器是否可用。和小节包含了检测加速度计和陀螺仪的可用性相关技术的讲解。在和中的陀螺仪可以检测六轴的运动。我们举一个简单的例子,这样你就可以尝试找出陀螺仪的价值所在。当你稳稳地拿着终端,坐在一个电脑椅上,顺时针或者逆时针旋转时,终端的加速计是没办法在它的垂直轴检测到终端的旋转的。从地板或者地球的角度来说,设备正围绕垂直轴旋转,但它并没有围绕它自己的垂直轴(即终端的垂直轴心)旋转。因此,加速计此时并不会检测到任何的动作但是,装备有陀螺仪的终端就可以检测到上面提到过的动作。这就让我们在检测终端运动时更加流畅。这点对于游戏而言尤其有用,游戏开发中开发者不仅要知道由加速计提供的轴的信息,而且还要得到终端辅的变化与地球的相对关系,而这,正是陀螺仪为我们提供的程序员会用到框架来访问加速计和陀螺仪的数据(要是有的话)。本章通篇都是使用这个框架。通过下列步骤可以为你的项目添加这个框架在中点击你的项目图标。选择你要添加核心动作框架的日标。在屏幕顶部,选择 Build phases选项卡在选项卡中找到并展开然后在它左下角点击按钮。、在框架列表中、选择并点击按钮。(见图)热心网友自发组织翻译版本年月日热心网友自发组织翻译Chase frameworks and braries to adda frameworkS CoreAudia-frameworkAc Core Data mewar8 CoreFound ation frameworks CoreGraphics frameworkE CoreMen ia frameworkE CoreMIDl frameworkde Core Telephony frameworkrCoreText frameworE Corevideo, framework8E EventkitUl frameworkexTema Accessory framewokBE Foundation. trAdd OtherCancelEd图为目标添加框架模拟器是不能模拟加速计跟陀螺仪硬件的。但你可以通过硬件→摇晃手势来生成个摇见动作。见图DeviceVersionRotate leftRotate right拥Shake gestureome合HLock第LSimulate Memory WarningToggle In-Call Status Bar 9TSimulate Hardware KeyboardTV Out图模拟器中的1.1.检测加速度计的可用性问题在你的程序中,你想要检测加速计硬件是否可用。热心网友自发组织翻译版本年月日热心网友自发组织翻译1.2方案用的方法可以检测加速计硬件,还可以用于检测加速计硬件是否正在向程序发送更新。首先我们要认我们导入了要求的头文件。@Interface DetectIng_the_ Avallabllity_of_an_ AccelerometerAppDelegateUIResponder@property@end然后我们就可以在我们应用的代理灾现类中进行加速计的可用性检测f(BOOL) application: (UIApplication ")applicationdidFinishLaunching WithOptions: NSDictionary )launchoptionstMMotionManager motion Manager= [[CMMotionManager alloc] initif([motion Manager is Accelerometer Available]NSLog(@"Accelerometer is available.y elsetNSLog(@"Accelerometer is not available. "if([motion Manager is AccelerometerActivel)NSLog(@"Accelerometer is active.F else iNSLog(@"Accelerometer is not active. " )self window= [[UIWindow alloc] initWith Frame[[UIScreen mairen boundsself window. backgroundColor= [UIColor white Color[self window makeKeyAndVisible]return YES在运行你应用的终端上的加速计硬件也许是可用的,但这并不意味着加速计硬件会向你的程序发送更新。要是加速计或者陀螺伩在给你的程序发送更新,我们称之为激活,这就要求你定义士个代理对象,就像晚些你会看到的那样要是你在模拟器中跑这段代码,你会在控制台窗口中看到类似下面的信息:在终端上跑相同的代码,你可能得到类似这样的信息1.3.讨论部终端可能有一个内置的加速计。由于我们不能确定某个终端是否装备有内置加速计,所以我们最好在用前检测一下可加速计是否可用要检测加速计硬件的可用性,你可以实例化一个的对象并访问它的热心网友自发组织翻译版本年月日热心网友自发组织翻译方法。这个类型的方法在加速计可用时会返回,反之返另外,你可以通过的方法来检测加速计是否在向你的程序发送更新(即是否是激活的)。你公在小节中学习如何获取加速计的数据1.1.4.参考小节1.2.检测陀螺仪的可用性1.2.1问题想要知道运行你程序的当前终端的陀螺仪是否可用1.2.2.方案用的实例方法可以检测陀螺仪硬件的可用性方法还可以检测陀螺仪是否在向你的程序发送更新(即是否是激活的)。(BOOL) application: (UIApplication ")applicationdid FinishLaunchingWithOptions: (NSDictionary " )launchOptions(CMMotion Manager" Manager =[[CMMotion Manager alloc] initIf ([motion Manager is GyroAvailable]xNSLog(@ Gryro is available. )Felse iNSLog(@" Gyro is not available.if ( [motion Manager is GyroActivel)NSLog(@"Gryo is active )NSLog(@"Gryo is not active. )self window=[[UIWindaw alloc] irmtwithFrame[UIScreen main Screen] boundsself window. backgroundColor =[UI Color white Colot[self window makekeyAndvisiblel;return YES模拟器没有陀螺仪的模拟。要是你在模拟器中跑这段代码,你会在控制台窗口中看到类似下面的信息讨论要是你打算发布一款会使用陀螺仪的应用,你要保证终端在没有陀螺仪硬件时也可以跑你的应用。比如,当你把陀螺仪作为你的游戏的一部分时,你要确保版本匹配的终端即热心网友自发组织翻译版本年月日热心网友自发组织翻译使没有安装陀螺仪也可以玩这个游戏要作到这点,你就必须先实例化一个的对象。然后访问(类型的)方法来获知在运行你的代码的终端上是否陀螺仪是否可用。你还可以川这个函数来查看陀螺仪是否在给你的应用发送一些更新。要∫解更多相关信息、,可以参阅小节的内容。1.2.4.参考小节1.3.获取加速器的数据问题如果你想让向你的应用发送加速计的数据。1.3.2.方案使用的实例方法:下面是使用获取加速计更新的试图控制器的头文作#import #import @interface Retrieving-Accelerometer-DataviewController: UMMewcontroller@property(nonatomic, strong)CMMotion Manager "motion Manager@end下面我们将实现我们的视图控制器并使用类的方法#import"Retrieving_ Accelerometer_ Dataview Controller. h@implementation Retrieving Accelerometer_DataViewController(void)viewDidLoad[super view DidLoadself motion Manager [[CMMotionManager allac]init]:If([self. motion Manager is AccelerometerAvailablelNSOperationQueue queue= [[NSOperationQueue alloc] init[self. motion ManagerstartAccelerometerUAdates PoQueue: queuewithHandler: (CMAccelerometerData accelerometer Data, NSError error)tNSLo9(@"X%04Y=%04,Z=%04,accelerometer Data. acceleration .xaccelerometer Data. acceleration. y,accelerometerData. acceleration. z)elseBOOLreturn@end热心网友自发组织翻译版本年月日热心网友自发组织翻译3.3.讨论加速计会报告三维数据(三个轴),即会向你的程序报告轴的值。这些值是封装在一个构造器中的。typedef struct idouble xdouble ydouble zF CMAcceleration当你拿着终端,让终端的屏幕纵向对着你:轴会从终端的水平中心的左边跑到右边,值域范围从左到右为轴会从终端的垂直中心的底部跑到顶部,值域范围从顶部到顶部为轴会从终端的后面跑到朝向你的一面,值域范围从终端的局面到前面为理解加速计硬件报告的这些值的最好方法就是看些例子。下面就有一个例子:我们假设你拿着一台终端,它的屏幕对着你,底部朝向地面,顶部指向上面。要是你可以向刚刚说的那样拿的很稳,没有任何偏移的话,你此时得到轴的值会是。现在你再上面姿势的基础上再做下下面的动作:让设备顺时针旋转度。此刻你得到的值擦是让设备再顺时针旋转度。现在终端的顶部一定是指向地面的。此刻你得到的值将是让设备再顺时针旋转度。现存终端的顶部一定是指向左边的。此刻你得到的值将最后设备再顺时针旋转度。现在终端的再次底部朝向地面,顶部指向上面。此刻你得到的值将是从这些值中,我们可以看到终端绕着轴转时加速计报告和值改变了,值不变我们来做另外一个实验。首先还是让终端的屏幕对着你,底部朝向地面,顶部指向上面。如你所知,此时得到轴的值会是。现在再做下下面的动作让终端沿着◇轴向后翻转度,此时它的顶部会指向后面。换句话说,像把它放在桌子上并∏面朝上那样拿着它。此刻你得到的值将是:现在让终端沿着轴再向后翻转度,此时它的后面会朝向你,它的顶部指向地面,底部指向天空。此刻你得到的值将是:让终端沿着轴再向后翻转度,此时它的正面会朝向地面,它的反面指向天空,顶部指向你。此刻你得到的值将是最后,你再向同样的方向做一次,此时它的屏幕对着你,底部朝向地面,顶部指向天空。你得到的值会跟刚开始的时候是一样的因此,我们观察到当沿着它的轴旋转时,轴跟轴的值会改变,而轴的则不变我鼓励你尝试一下第三种旋转的方式绕着它的轴(从顶部到底部)旋转并观察轴的值的变化。要接收加速计的更新,你有两个选项:的实例方法:这个方法会把加速计的更新信息传递给一个操作队列(一种队列)并需要有一些的关于块的热心网友自发组织翻译9版本年月日热心网友自发组织翻译基础知识。关于块的更多信息可以参阅第章的实例方法旦你调用了这个方法,加速计(如何可用的话)就会开始在动作管理对象中更新加速计数据。你需要设置你自己的线程来不断读取类的(类型为的)属性的值。在木节,你会用到第一个方法(块的方式)。我极力推荐在你开始木节内容前,先阅读第章的内容。我们为类的实例方法提供的,块的类型必须是类型的换句话说,我们必须在块中接收两个参数。第一个参数必须是类型的,并且第二个参数必须是类型的,就像上面代码示例单视这样3.4.参考第小节1.4.检测i0S设备的摇晃1.4.1问题你如果想知道用户何时动了终端4方案使用你的应用的窗口对象的方法1.4.3.讨论终端捕获到一个动作时,你应用的窗凵的方法就会被调用。下面是这个方法的简单实现:(void) motion Ended: (UIEvent subtype)motionwithEvent: (UIEvent eventA Do something with the motion如你所见,这个参数的类型是类型的其中个值就是我们所感兴趣的。只要我们检测到这个事件,我们就知道用户晃动了它的手机。为了得到我们应用的窗口,我们需要继承具体步骤是在里,当你打开了你的项目后,选择→从左边看,选择主目录下的子目录热心网友自发组织翻译10版本年月日