iOS开发----CMDeviceMotion

iOS开发-CMMotionManager传感器陀螺仪 CMMotionManager是什么 CMMotionManager 是 Core Motion 库的核心类,负责获取和处理手机的运动信息,它可以获取的数据有 * 陀螺仪,标识设备在三个主轴上的瞬时旋转 * 加速度,标识设备在三维空间中的瞬时加速度 * 磁场信息,标识设备相对于地球磁场的方位 设备运动数据,标识关键的运动相关属性,包括设备用户引起的加速度、姿态、旋转速率、相对于校准磁场的方位以及相对于重力的方位等,这些数据均来自于 Core Motion 的传感器融合算法。 阅读详情

深藏于每台iPhone光滑的屏幕之下,处于触摸屏与芯片之间,依偎在逻辑板之上的陀螺仪和加速器总是被众人所遗忘。

所以这些玩意拿来干嘛?当然是用来在旧式的点击和滑动之外开创新交互方式的啦,这里就要动用到Core Motion框架,这个东西能非常有效的驾驭住这些传感器。

对于使用了M7或者M8处理器的设备,Core Motion框架支持了一些预置的motion动作,比如脚步数、爬楼还有移动类型(行走、骑行等等)。

Core Motion可以让开发者从各个内置传感器那里获取未经修改的传感数据,并观测或响应设备各种运动和角度变化。这些传感器包括陀螺仪、加速器和磁力仪(罗盘)。

加速器和陀螺仪的数据都是描述沿着iOS设备三个方向轴上的位置,对于一个竖屏摆放的iPhone来说,X方向从设备的左边(负)到右边(正),Y方向则是由设备的底部(-)到顶部(+),而Z方向为垂直于屏幕由设备的背面(-)到正面(+)。

这些成组的数据根据不同的用法会有不同的表示方式,下面我们就开始来说一说。

axes.png

CoreMotionManager

CoreMotionManager类能够使用到设备的所有移动数据(motion data),Core Motion框架提供了两种对motion数据的操作方式,一个是"pull",另一个是"push",其中"pull"方式能够以CoreMotionManager的只读方式获取当前任何传感器状态或是组合数据。"push"方式则是以块或者闭包的形式收集到你想要得到的数据并且会在特定周期内得到实时的更新。

为了保证性能,苹果建议在使用CoreMotionManager的时候采用单件模式。

CoreMotionManager为四种motion数据类型的每一个都提供了统一的接口:accelerometer,gyro,magnetometer和deviceMotion。下面的例子演示了如何与陀螺仪交互的方式,当然如果是想跟其它设备交互的话只需要把下面的gyro替换成你想要使用的类型就行了。

检测设备可用性

1
2
3
let manager = CoreMotionManager() if  manager.gyroAvailable {
      // ...
}

为了让事情在Swift和Objective-C之间变得简单且相同,这里就假设我们此前已经在所有示例中声明了一个manger实例作为视图控制器的属性。

设置更新周期

1
manager.gyroUpdateInterval = 0.1

这里的时间设置是NSTimeInterval类型,所以你需要将更新时间设置为秒级别的:这样会减缓响应的效率,不过能够有效的降低CPU的占用率。

使用“pull”方式更新数据

1
manager.startGyroUpdates()

在这段代码被调用之后,manger.gyroData即可随时可用,并反应当前设备陀螺仪数据。

使用“push”方式更新数据

1
2
3
4
let queue = NSOperationQueue.mainQueuemanager.startGyroUpdatesToQueue(queue) {
     (data, error)  in
     // ...
}

这段代码会根据给定的更新周期按一定频率被调用。

停止更新

1
manager.stopGyroUpdates()

使用加速器

现在我们来试试为App的启动页添加一个有趣的功能,使得启动页的图片无论在设备如何倾斜的情况下都保持水平。

来思考一下下面的代码:

首先,我们需要检测确保我们设备上的加速器数据是可用的,然后指定一个频率很高的更新周期,接着在一个闭包中进行更新来旋转UIImageView属性。

1
2
3
4
5
6
7
8
9
//Swift
if  manager.accelerometerAvailable {
     manager.accelerometerUpdateInterval = 0.01
     manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) {
         [weak self] (data: CMAccelerometerData!, error: NSError!)  in
         let rotation = atan2(data.acceleration.x, data.acceleration.y) - M_PI
         self?.imageView.transform = CGAffineTransformMakeRotation(CGFloat(rotation))
     }
}
1
2
3
4
5
6
7
8
9
//Objective-C
RotationViewController * __weak weakSelf = self; if  (manager.accelerometerAvailable) {
     manager.accelerometerUpdateInterval = 0.01f;
     [manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]
                               withHandler:^(CMAccelerometerData *data, NSError *error) {
         double rotation = atan2(data.acceleration.x, data.acceleration.y) - M_PI;
         weakSelf.imageView.transform = CGAffineTransformMakeRotation(rotation);
     }];
}

每一个CMAccelerometerData包含了x,y,z三个值,每一个显示的是在该方向上的加速度,并以G为单位(G为重力加速度)。也就是说,如果你的设备保持静止然后竖直放置的话,加速度的值就是(0,-1,0),而将其平放在桌面上就会是(0,0,-1),而竖直向右倾斜45度的情况下,加速度的值则为(0.707,-0.707,0)。

accelerometer.gif

如上图,结果有些差强人意,你可以发现图片在旋转的时候会有一些抖动,而且移动设备的位置比起旋转设备而言,对加速器的影响可能更甚。这里可以依靠对读入的数据抽样取平均值来缓和问题,不过我们可以来看一看考虑进陀螺仪之后的效果。

加入陀螺仪数据

我们可以使用startGyroUpdates来获取无损的陀螺仪数据,不过在这里使用的是deviceMotion类型来获取加速器和陀螺仪的复合数据。通过使用陀螺仪,Core Motion能依靠重力加速度来区分用户的动作,     并且作为一个属性表示在我们从处理程序中获取的CMDeviceMotionData实例中。代码和第一个示例中的差不多:

1
2
3
4
5
6
7
8
9
//Swift
if  manager.deviceMotionAvailable {
     manager.deviceMotionUpdateInterval = 0.01
     manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) {
         [weak self] (data: CMDeviceMotionData!, error: NSError!)  in
         let rotation = atan2(data.gravity.x, data.gravity.y) - M_PI
         self?.imageView.transform = CGAffineTransformMakeRotation(CGFloat(rotation))
     }
}
1
2
3
4
5
6
7
8
9
//Objective-C
RotationViewController * __weak weakSelf = self; if  (manager.deviceMotionAvailable) {
     manager.deviceMotionUpdateInterval = 0.01f;
     [manager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
                                        withHandler:^(CMDeviceMotion *data, NSError *error) {
         double rotation = atan2(data.gravity.x, data.gravity.y) - M_PI;
         weakSelf.imageView.transform = CGAffineTransformMakeRotation(rotation);
     }];
}

来看看效果,会好得多:

gravity.gif

UIClunkController敲击反应

我们来试试别的,使用陀螺仪和加速器复合数据中的非重力部分来新添加一种交互方式。在这个示例中我们使用了CMDeviceMotionData中的userAcceleration属性,当用户将设备的左边缘敲击手掌的时候实现导航返回功能。

记住手中设备的X轴是穿过设备侧面的,并且向左为负值。假如设备感应到用户施加了一个向左大于2.5G的加速度,就会引发从栈堆中取出一个视图控制器界面。在这里比起前面的代码实现起来只用修改几行:

1
2
3
4
5
6
7
8
9
10
//Swift
if  manager.deviceMotionAvailable {
     manager.deviceMotionUpdateInterval = 0.02
     manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) {
         [weak self] (data: CMDeviceMotion!, error: NSError!)  in
         if  data.userAcceleration.x < -2.5 {
             self?.navigationController?.popViewControllerAnimated( true )
         }
     }
}
1
2
3
4
5
6
7
8
9
10
//Objective-C
ClunkViewController * __weak weakSelf = self; if  (manager.deviceMotionAvailable) {
     manager.deviceMotionUpdateInterval = 0.01f;
     [manager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
                                        withHandler:^(CMDeviceMotion *data, NSError *error) {
         if  (data.userAcceleration.x < -2.5f) {
             [weakSelf.navigationController popViewControllerAnimated:YES];
         }
     }];
}

即刻见效:

s.gif

获取Attitude

我们可以通过使用陀螺仪的数据来获取更好的加速度数据,但是这并非唯一可用的改进——我们还可以获取设备在空间中的具体方位。在CMDeviceMotionData中有一个attitude属性,是一个CMAttitude类的实例。其中用了三种不同的方式表示了设备的方位:欧拉角,四元数和旋转矩阵,每一个都参考给定的坐标系。

找到参考坐标系

你可以设想一个根据设备某个方向来计算其他剩余角度的参考系,下面四中可用的参考系都假设设备平放在平面上,然后按照其指定的方向增加角度。

CMAttitudeReferenceFrameXArbitraryZVertical 描述的参考系默认设备平放(垂直于Z轴),在X轴上取任意值。实际上当你开始刚开始对设备进行motion更新的时候X轴就被固定了。

CMAttitudeReferenceFrameXArbitraryCorrectedZVertical 本质上和上一个一样,不过这里还使用了罗盘来对陀螺仪的测量数据做了误差修正,当然对于CPU来说会增加一定的消耗(对电池也一样)。

CMAttitudeReferenceFrameXMagneticNorthZVertical 同样是默认设备平放,然后X轴(也就是设备的右侧)指向地磁北向。这一设置需要在使用前用设备画"8"字来校正罗盘。

CMAttitudeReferenceFrameXTrueNorthZVertical 和上面一个一样,不过这里参考的是真实的地磁北极,因此会需要使用位置数据和和罗盘。

对于我们想要实现的情况,默认的任意值参考系已经够用——一会儿你就知道为什么了。

欧拉角

三种表示方式中欧拉角是最容易理解的,它简单的描述了绕各坐标轴旋转的角度,这些坐标轴我们之前已经提到过。pitch是指绕X轴旋转,考虑设备平放,pitch增加则设备正面倾斜抬起,减小则后仰。roll是Y轴方向,增加则设备往右滚动,减少则往左。yaw是Z轴方向,逆时针方向增加,顺时针方向减少。

下述的这些值都是参考右手定则:右手虚握,大拇指竖起朝向任意轴的正方向,顺着剩余四指旋转方向为正,逆向为负。

功能的实现

现在我们来做一个你问我答形式的App界面,当屏幕旋转到面对被试者时只显示提示内容,而面对提问者的时候会自动切换到显示答案的界面。

根据参考系来计算切换会很麻烦,我们需要考虑设备的初始位置,然后才能定义设备正指向哪个方向,以及旋转到那一个角度才会被反过来。所以我们要用的方法是将一个CMAttitude实例保存起来,并以它算出一个欧拉角作为原点,之后所有的旋转都用multiplyByInverseOfAttitude()方法来换算方向。

当提问者点击按钮开始提问的时候我们就开始了交互过程——注意这里deviceMotion为initialAttitude使用到了"pull"方式。

1
2
3
4
5
6
7
8
//Swift
// get magnitude of vector via Pythagorean theorem
func magnitudeFromAttitude(attitude: CMAttitude) -> Double {
     return  sqrt(pow(attitude.roll, 2) + pow(attitude.yaw, 2) + pow(attitude.pitch, 2))} // initial configurationvar 
initialAttitude = manager.deviceMotion.attitude
var  showingPrompt =  false // trigger values - a gap so there isn't a flicker zone
let showPromptTrigger = 1.0
let showAnswerTrigger = 0.8
1
2
3
4
5
6
7
8
9
10
//Objective-C
// --- class method to get magnitude of vector via Pythagorean theorem+ 
(double)magnitudeFromAttitude:(CMAttitude *)attitude {
     return  sqrt(pow(attitude.roll, 2.0f) + pow(attitude.yaw, 2.0f) + pow(attitude.pitch, 2.0f));
} // --- In @IBAction handler
// initial configuration
CMAttitude *initialAttitude = manager.deviceMotion.attitude;
__block BOOL showingPrompt = NO; // trigger values - a gap so there isn't a flicker zone
double showPromptTrigger = 1.0f;
double showAnswerTrigger = 0.8f;

接下来,调用我们熟悉的startDeviceMotionUpdates,计算一下由三个欧拉角描述的向量的大小,并作为切换视图的触发器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Swift
if  manager.deviceMotionAvailable {
     manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) {
         [weak self] (data: CMDeviceMotion!, error: NSError!)  in
         // translate the attitude
         data.attitude.multiplyByInverseOfAttitude(initialAttitude)
         // calculate magnitude of the change from our initial attitude
         let magnitude = magnitudeFromAttitude(data.attitude) ?? 0
         // show the prompt
         if  !showingPrompt && magnitude > showPromptTrigger {
             if  let promptViewController = self?.storyboard?.instantiateViewControllerWithIdentifier( "PromptViewController" ) as? PromptViewController {
                 showingPrompt =  true
                 promptViewController.modalTransitionStyle = UIModalTransitionStyle.CrossDissolve
                 self!.presentViewController(promptViewController, animated:  true , completion: nil)
             }
         }
         // hide the prompt
         if  showingPrompt && magnitude < showAnswerTrigger {
             showingPrompt =  false
             self?.dismissViewControllerAnimated( true , completion: nil)
         }
     }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Objective-C
FacingViewController * __weak weakSelf = self; if  (manager.deviceMotionAvailable) {
     [manager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
                                        withHandler:^(CMDeviceMotion *data, NSError *error) {
         // translate the attitude
         [data.attitude multiplyByInverseOfAttitude:initialAttitude];
         // calculate magnitude of the change from our initial attitude
         double magnitude = [FacingViewController magnitudeFromAttitude:data.attitude];
         // show the prompt
         if  (!showingPrompt && (magnitude > showPromptTrigger)) {
             showingPrompt = YES;
             PromptViewController *promptViewController = [weakSelf.storyboard instantiateViewControllerWithIdentifier:@ "PromptViewController" ];
             promptViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
             [weakSelf presentViewController:promptViewController animated:YES completion:nil];
         }
         // hide the prompt
         if  (showingPrompt && (magnitude < showAnswerTrigger)) {
             showingPrompt = NO;
             [weakSelf dismissViewControllerAnimated:YES completion:nil];
         }
     }];
}

一切实现完毕,现在我们来看看效果,就像下面这样根据旋转角度会自动切换界面了:

ss.gif

延伸阅读

此前我看过一些关于CMAttitude四元数和旋转矩阵的介绍,也不是很详尽。四元数实际上有个很有趣的来源,也许你会觉得这个条目够长够满足你。

优化

为了使代码的可读性更高,我们可以把所有有关CoreMotionManger的处理放到主队列中去。在实践中这样做会比让其在各自队列中调用好得多,起码不会让交互显得迟缓,不过我们需要回到主队列中更改一些元素。使用NSOperationQueue的addOperationWithblock方法即轻松实现:

1
2
3
4
5
6
7
8
//Swift
let queue = NSOperationQueue()manager.startDeviceMotionUpdatesToQueue(queue) {
     [weak self] (data: CMDeviceMotion!, error: NSError!)  in
     // motion processing here
     NSOperationQueue.mainQueue().addOperationWithBlock {
         // update UI here
     }
}
1
2
3
4
5
6
7
8
//Objective-C
NSOperationQueue *queue = [[NSOperationQueue alloc] init];[manager startDeviceMotionUpdatesToQueue:queue
                              withHandler:^(CMDeviceMotion *data, NSError *error) {
     // motion processing here
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{
         // update UI here
     }];
}];

要清楚并不是所有的交互都用Core Motion来实现就是最好的,通过motion来触发导航动作固然好不过也容易出现意外触发,漫无目的的动画也会让人产生审美疲劳。聪明的开发者取悦用户不应该依靠这些噱头,而是依靠合理的设计。

(本文由Cocoachina翻译,原文地址:http://www.cocoachina.com/ios/20141103/10111.html)

24、iOS开发:Core Motion框架的使用详解 本文详细介绍了在iOS开发中使用Core Motion框架获取设备运动数据的方法,包括注册摇晃事件、访问加速度计、陀螺仪和磁力计的原始数据,以及使用CMDeviceMotion获取更精确的设备方向信息。文章还深入解析了姿态属性(roll、pitch、yaw)和参考框架的选择,并提供了实际应用案例和代码优化建议,帮助开发者构建更具交互性和实用性的iOS应用。 阅读详情

相关推荐

IOS 陀螺仪开发(CoreMotion框架)实例详解

iOS陀螺仪 参数意义 self.mManager = [[CMMotionManager alloc]init]; self.mManager.deviceMotionUpdateInterval = 0.5; if (self.mManager.gyroAvailable) { [self.mManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable e

iOS开发- CMMotionManager 开发

其中陀螺仪、加速计和磁力计的数据获取均依赖于 CMMotionManager。

旭日的博客 1175

python-调用动态链接库dll/so的方法

使用python ctyeps CDLL来调用linux下的so动态链接库或windows下的dll动态链接库

XIAOXIANG233233的博客 3662

详说CMDeviceMotion

深藏于每台iPhone光滑的屏幕之下,处于触摸屏与芯片之间,依偎在逻辑板之上的陀螺仪和加速器总是被众人所遗忘。 所以这些玩意拿来干嘛?当然是用来在旧式的点击和滑动之外开创新交互方式的啦,这里就要动用到Core Motion框架,这个东西能非常有效的驾驭住这些传感器。 对于使用了M7或者M8处理器的设备,Core Motion框架支持了一些预置的motion动作,比如脚步数、爬楼还有移动

呆萌院长 1987

Python+OpenCV实现游戏自动刷怪脚本(附完整代码)

本文详细介绍了如何使用Python和OpenCV开发游戏自动刷怪脚本,涵盖环境搭建、图像识别、行为决策引擎及反检测优化等关键技术。通过完整的代码示例,帮助开发者实现从简单脚本到智能自动化系统的升级,提升游戏效率。

weixin_29032489的博客 517

常见卫星图源下载教程

上面列出的8个常见的亚米级别数据源都可以通过xyz协议或者wmts/wms协议进行下载。这些协议是什么?地理信息数据为了方便网络传输,制定了一系列的地理数据传输标准(wms/wmts/xyz等)。协议特点优点缺点栅格数据支持矢量数据支持WMS通过HTTP请求获取GIS数据,服务器会将数据渲染成图像高度定制的地图;交互性强服务器渲染图像,响应时间较长支持有限支持WMTS提供预渲染的地图瓦片速度快,因为地图瓦片可以预先生成并在请求时快速提供瓦片的内容是预先确定的,无法进行定制支持。

锐多宝的地理空间 1万+

[IOS开发]重力感应判断屏幕状态-Swift

var motionManager:CMMotionManager?  func startMotionManager() {             if motionManager == nil {                              motionManager = CMMotionManager()

laycept的脑洞 1179

新手必看!Stata工具变量分析中的三大陷阱:如何正确解读LM统计量、CDW检验和Hansen J值

本文深度解析Stata工具变量分析中的三大核心检验:不可识别检验、弱IV检验和过度识别检验,帮助新手避开常见陷阱。详细解读LM统计量、CDW检验和Hansen J值的正确使用方法,提供实战案例和Stata操作指南,确保研究结论的可靠性。

weixin_29231027的博客 572

ios开发——CMDeviceMotion陀螺仪的使用

深藏于每台iPhone光滑的屏幕之下,处于触摸屏与芯片之间,依偎在逻辑板之上的陀螺仪和加速器总是被众人所遗忘。 所以这些玩意拿来干嘛?当然是用来在旧式的点击和滑动之外开创新交互方式的啦,这里就要动用到Core Motion框架,这个东西能非常有效的驾驭住这些传感器。 对于使用了M7或者M8处理器的设备,Core Motion框架支持了一些预置的motion动作,比如脚步数、爬楼还有移动

zzzzzdddddxxxxx的专栏 5769

2025华东杯A/B/C题解题思路+可运行代码参考

这些因素包括但不限于:助滑坡的坡度、运动员的质量、滑雪板的接触面与雪地的摩擦力、空气阻力系数、运动员的体型和衣物形态等。助滑坡是运动员滑行至起跳台前的最后一段坡道,这一段坡道的坡度、长度和运动员的姿势会直接影响到起跳时的初始速度。运动员的滑行速度不仅受助滑坡的坡度影响,还受到摩擦力、空气阻力和重力等多方面因素的影响。通过合理的姿势调整,运动员能够有效减少空气阻力,增加身体的重力加速度,进而提升滑行速度。助滑坡的角度通常介于10°到12°之间,而运动员的滑行速度将受到重力、摩擦力和空气阻力的共同作用。

qq_52590045的博客 1796

萤石云cs刷机解绑固件

萤石CS-C2C-32WFR刷机包,萤石CS-C6TC刷机包,萤石CS-C6H刷机包,萤石猫眼产品等等。萤石云摄像头固件修改,绑定手机号解绑,更换序列号教程。

海康威视技术支持 2万+

IOS开发----CMDeviceMotion陀螺仪的使用

原文地址:http://www.cocoachina.com/ios/20141103/10111.html

Dev_APP的专栏 4414

YOLOv11 改进 - 注意力机制 | HaloNet 局部自注意力 (Local Self-Attention) 以分块交互策略实现高效全局上下文建模

本文介绍了局部自注意力机制(HaloAttention)在YOLOv11中的结合应用。局部自注意力通过关注输入数据局部区域来捕捉特征关系,能降低计算复杂度、增强局部特征捕捉,且可与CNN结合。其计算时先定义局部窗口,再计算注意力权重并加权求和。我们将HaloAttention集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,改进后的模型在目标检测和实例分割等任务中表现更佳,证明了自注意力模型在传统卷积主导领域的有效性。

魔改工程师的博客 1141

cmmotionmaneger

http://justsee.iteye.com/blog/1933099 from : http://mobile.51cto.com/iphone-285018.htm iOS4中Core Motion框架使用方法是本文要介绍的内容,主要是来学习IOS4中框架的内容。在iOS4之前,加速度计由UIAccelerometer类来负责采集工作,而电子罗盘则由Core Location...

dinghui1875的博客 298

分布式计算Ray框架面试题及参考答案

动态任务图执行引擎是一种能够根据任务之间的依赖关系和运行时的实际情况,动态构建和执行任务图的系统。在 Ray 中,动态任务图执行引擎允许任务在运行时根据数据可用性、计算资源状态等因素,灵活地决定后续任务的执行顺序和方式。对于 AI 应用来说,其往往具有动态性的特点。例如,在深度学习模型的训练过程中,可能需要根据训练的结果动态调整下一轮训练的参数、数据增强方式或者模型结构。动态任务图执行引擎可以很好地支持这些动态需求。它能够根据 AI 应用中各个任务的实时输出和依赖关系,动态地生成和调整任务图。

大模型大数据攻城狮的专栏 1350

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

分享一篇NSHipster的CMDeviceMotion

关于CoreMotion的一些基本用法,比较实在; 1,Adding the Accelerometer Using the Accelerometer UIImageViewRotationViewController*__weakweakSelf=self; if(manager.accelerometerAvailable){ manager.a...

weixin_30908707的博客 97

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

CMDeviceMotion使用

CMDeviceMotion使用 by 吴雪莹 manager = [[CMMotionManager alloc] init]; ViewController *__weak weakSelf=self; // 1 if(manager.deviceMotionAvailable){ manager.deviceMotionUpdateInterval=0.01f; ...

weixin_34024034的博客 149

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

CMDevice​Motion Written by Nate Cook (译)

在每个iPhone的闪亮的光滑屏幕下面,安装着鲜为人知的陀螺仪和加速器,它们位于屏幕和SoCs的逻辑板上,而然,在很多时候它们被忽略了。为什么会变成这样? Core Motion 这个框架让我们很容易的去使用这些传感器,它使得交互起来就像为我们日常打开水龙头和刷卡一样简单。对于装有M7或M8运动处理器的设备, Core Motion 还为这些提供了可以访问存储在本地运动数据的功能,例如:步数,爬楼梯

JasonWang的博客 618

iOS中Core Motion框架的介绍和使用

作为一个刚学习iPhone编程一周的人来说,其实写这篇文章的目的不是传道授业解惑,而是为了知识的总结。如果能吸引到各位为我传道授业解惑那再好不过了。文章基本的内容,整个流程是参照WWDC 2010上的session 423: Sensing Device Motion in iOS4写的,同时参考了开发文档Event Handling Guide for iPhone OS: Motion E

NewJerryj的专栏 2万+

iOS开发-CoreMotion核心动作开发-陀螺仪CMRotationRate-加速计CMAcceleration-磁强计Magnetometer开发CoreMotion核心动作实践

CoreMotion 核心动作 简介:CoreMotion是iOS系统目前用于处理加速度计,陀螺仪,计步器和环境相关事件。 Core Motion的报告来自iOS设备的板载硬件的运动和环境相关数据,包括加速度计和陀螺仪,以及计步器,磁力计和气压计。您可以使用此框架访问硬件生成的数据,以便在应用程序中使用它。例如,游戏可能使用加速度计和陀螺仪数据来控制屏幕上的游戏行为。 提示: 在iOS 10.0...

伪随机的张三 3945

[IOS开发]重力感应判断屏幕状态-OC

@import CoreMotion; @property (nonatomic,strong)CMMotionManager *motionManager; -(void)starMotionManager{     if (_motionManager == nil) {         _motionManager = [CMM

laycept的脑洞 2401

iOS学习笔记 加速计和陀螺仪

一、CoreMotion框架介绍 我们知道有一些iOS的应用,会有一些特殊的要求,比如: 电子罗盘指南针之类的应用:让我们知道方向。运动类型软件:让我们知道我们跑步多少公里。社交软件中的摇一摇功能。游戏中扮演角色类中根据设备的晃动等进行操作。 其实,他们多半是使用了iOS中的一个核心运动框架CoreMotion.framework 使用iOS提供给我们的CoreMoti

sifenkesi1的专栏 2748

iOS4中Core Motion框架的介绍和使用

作为一个刚学习iPhone编程一周的人来说,其实写这篇文章的目的不是传道授业解惑,而是为了知识的总结。如果能吸引到各位为我传道授业解惑那再好不过了。文章基本的内容,整个流程是参照WWDC 2010上的session 423: Sensing Device Motion in iOS4写的,同时参考了开发文档Event Handling Guide for iPhone OS: Motion Eve

yu0089的专栏 966

iOS学习笔记34-加速计和陀螺仪

一、CoreMotion框架介绍我们知道有一些iOS的应用,会有一些特殊的要求,比如: 1. 电子罗盘指南针之类的应用:让我们知道方向。 2. 运动类型软件:让我们知道我们跑步多少公里。 3. 社交软件中的摇一摇功能。 4. 游戏中扮演角色类中根据设备的晃动等进行操作。其实,他们多半是使用了iOS中的一个核心运动框架CoreMotion.framework 使用iOS提供给我们的CoreMo

执着丶执念的博客 2967
上一篇: 超越Objective-C,超越Swift
下一篇: Objective-C Runtime 运行时之一:类与对象
「已注销」
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值