1,加速传感器可以监听到x,y,z三个方向的加速度,使用步骤如下:

(1)实例化cmmotionmanager类
(2)向cmmotionmanager的accelerometerUpdateInterval属性中设置通知间隔时间值。
(3)使用NSOperationQueue.currentQueue()建立一个监听队列。
(4)使用startAccelerometerUpdatesToQueue方法更新监听队列,并设置回调函数用于接受加速度通知。在回调函数中使用accelerometerData.acceleration相关属性可以获取x、y、z各个方向的加速度。

2,通知频率设置建议
accelerometerUpdateInterval表示通知频率,表示间隔多少秒通知一次。iPhone开发文档中推荐使用的通知间隔如下:
(1)检测设备朝向:1/10 ~ 1/20
(2)在游戏中需要实时使用加速传感器时:1/30 ~ 1/60
(3)检测敲击设备或者剧烈摇动设备的情况下:1/70 ~ 1/100
3,x,z轴
(1)对于iphone手机来说,画面上下为y轴,左右为z轴,贯穿屏幕为z轴。
(2)向上,向右,手机的前面分别是各轴的正方向。
4,加速度(原始加速度)
加速度不仅受震动手机时施加的作用力的影响,还会持续受到重力的影响。因此iphone手机如果垂直拿在手上的话,Y轴负方向将受重力作用,加速度y属性将一直为负值(最小值为-1.0)

5,Gravity和Useracceleration
网友cruise_H问:motionManager.deviceMotion.useracceleration.x和motionManager.accelerometerData!.acceleration.x两个获取的acceleration有什么区别?
上面提到的原始的加速度(即通过startAccelerometerUpdates获取的那个值)实际上是由两种加速度合成而来的。一个是重力加速度(Gravity),一个是用户对手机施加的加速度(Useracceleration)(当然我们也可以分别获取这两种加速度)。
所以当手机垂直静止时,虽然Useracceleration是0,但由于有重力加速度,所以两个合成后加速度y属性便是为负值。

6,测试样例
该应用运行后,将在画面正中央显示一个球体。倾斜手机时,球体将向着倾斜的方向运动。碰撞到四壁后反弹回来。
(注意:由于需要用到设备的重力感应器,所以要使用真机调试,模拟器运行小球不会动。)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import UIKit
CoreMotion
class ViewController : UIViewController , UIAccelerometerDelegate {
var ball: UIImageView !
speedX: UIaccelerationValue =0
speedY: =0
motionManager = cmmotionmanager ()
override func viewDidLoad() {
super .viewDidLoad()
//放一个小球在中央
ball= (image: UIImage (named: "ball" ))
ball.frame= CGRectMake (0,50,50)
ball.center= self .view.center
.view.addSubview(ball)
motionManager.accelerometerUpdateInterval = 1/60
if (motionManager.accelerometeravailable)
{
queue = NSOperationQueue .currentQueue()
motionManager.startAccelerometerUpdatesToQueue(queue,withHandler:
{(accelerometerData : CMAccelerometerData !,error : NSError !) in
//动态设置小球位置
.speedX += accelerometerData.acceleration.x
.speedY += accelerometerData.acceleration.y
posX= .ball.center.x + CGFloat ( .speedX)
posY= .ball.center.y - .speedY)
//碰到边框后的反弹处理
posX<0 {
posX=0;
//碰到左边的边框后以0.4倍的速度反弹
.speedX *= -0.4
} else posX > .view.bounds.size.width {
.view.bounds.size.width
//碰到右边的边框后以0.4倍的速度反弹
.speedX *= -0.4
}
posY<0 {
posY=0
//碰到上面的边框不反弹
.speedY=0
posY> .view.bounds.size.height{
.view.bounds.size.height
//碰到下面的边框以1.5倍的速度反弹
.speedY *= -1.5
}
.ball.center= CGPointMake (posX,posY)
})
}
}
}

(上面是使用Xcode6.4编写的,在Xcode7 beta4中由于语法变化,会报“Type of expression is ambiguous without more context”错误,可使用如下代码。标注的表示修改的地方)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import UIKit
CoreMotion
class ViewController : UIViewController ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas, UIAccelerometerDelegate {
var ball: UIImageView !
speedX: UIaccelerationValue =0
speedY: =0
motionManager = cmmotionmanager ()
override func viewDidLoad() {
super .viewDidLoad()
//放一个小球在中央
ball= (image: UIImage (named: "ball" ))
ball.frame= CGRectMake ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,50)
ball.center= self .view.center
.view.addSubview(ball)
motionManager.accelerometerUpdateInterval = 1/60
if (motionManager.accelerometeravailable)
{
let queue = NSOperationQueue .currentQueue()
motionManager.startAccelerometerUpdatesToQueue(queue!,withHandler:
{ (accelerometerData : CMAccelerometerData ?,error: NSError ?) -> Void in
//动态设置小球位置
.speedX += accelerometerData!.acceleration.x
.speedY += accelerometerData!.acceleration.y
posX= .ball.center.x + CGFloat ( .speedX)
posY= .ball.center.y - .speedY)
//碰到边框后的反弹处理
posX<0 {
posX=0;
//碰到左边的边框后以0.4倍的速度反弹
.speedX *= -0.4
} else posX > .view.bounds.size.width {
.view.bounds.size.width
//碰到右边的边框后以0.4倍的速度反弹
.speedX *= -0.4
}
posY<0 {
posY=0
//碰到上面的边框不反弹
.speedY=0
posY> .view.bounds.size.height{
.view.bounds.size.height
//碰到下面的边框以1.5倍的速度反弹
.speedY *= -1.5
}
.ball.center= CGPointMake ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,posY)
})
}
}
}

原文出自: www.hangge.com 转载请保留原文链接: http://www.hangge.com/blog/cache/detail_545.html

Swift - 加速传感器CoreMotion的用法,小球加速运动并反弹样例的更多相关文章

  1. 使用iOS 7获取后台步骤

    我正在开发一个应用程序,在其中我应该获得我在体育活动中所做的步骤数.我找到了这段代码:使用此代码,当iPhone的显示器打开时,它工作得很好,但是当我关闭显示器时,它不再起作用.为了跟踪位置,我在iOS7中看到了一个功能“后台模式”.使用此功能,我可以在iPhone显示屏关闭时获取坐标.现在我要在显示器关闭时获取加速度计值,我该怎么做?我在网上看到iOS不允许在后台模式下使用加速度计,我如何在后台模式下使用加速度计来计算步数?

  2. iOS自由落体了解iphone的加速度计数据

    为什么当我将手机从大约4英尺放到枕头上,然后绘制用户加速度的大小时,我得到的峰值为1.5g然后是1g然后是2.5g然后是1g然后是2.5g然后是1g时间范围内的0g自由落体,有10个样本.理想情况下,由于重力减去空气阻力,它应该以恒定速率向下加速,那么为什么加速度会在自由落体时上下波动?是什么导致了这种噪音?

  3. 如何在IOS中获取加速度计数据?

    我正在使用UIAccelerotmeterDelegate方法accelerometer:didAccelerate:,但最近该方法已经在iOS5.0中弃用.那么获取加速度计数据的另一种方法是什么?文档没有提到我们应该使用的替代方法.解决方法您应该使用CoreMotionframework(在iOS4.0中引入)作为替代.创建一个cmmotionmanager的实例,并告诉它startAccele

  4. Swift之加速度传感器编程

    一:加速度核心类:首先需要创建一个加速度核心类MotionClass,导入CoreMotion核心类的创建思路是:1.需要创建一个单例,获取到加速度cmmotionmanager实例。然后调用相应的start或stop方法即可

  5. Swift - 加速传感器CoreMotion的用法,小球加速运动并反弹样例

    使用startAccelerometerUpdatesToQueue方法更新监听队列,并设置回调函数用于接受加速度通知。2,通知频率设置建议accelerometerUpdateInterval表示通知频率,表示间隔多少秒通知一次。一个是重力加速度,一个是用户对手机施加的加速度。所以当手机垂直静止时,虽然Useracceleration是0,但由于有重力加速度,所以两个合成后加速度y属性便是为负值。6,测试样例该应用运行后,将在画面正中央显示一个球体。倾斜手机时,球体将向着倾斜的方向运动。碰撞到四壁后反弹

  6. 从android加速度计获取倾斜角度

    我有一个实现SensorEventListener的类,我想得到我的设备使用加速度计的倾斜角度.我在互联网上查找了一些例子但他们使用了Sensor.TYPE_MAGNETIC_FIELD.我相信我的设备没有这个传感器,因为我做的时候以下检查manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size(),我得零.有没有办法通过使用获得倾斜角度Senso

  7. android – 线性加速方向,用于跟踪手机的上下移动

    我试图仅在垂直方向上跟踪设备的移动,即向上和向下移动.这应该与设备的方向无关.我已经知道或尝试过的事情就是这些>线性加速度由传感器TYPE_LINEAR_acceleration给出,轴是电话轴,因此跟踪任何特定轴都没有区别.>我尝试应用转置或旋转矢量的倒数(旋转矢量的反转或转置相同),然后尝试跟踪线性加速度矢量的z方向.似乎没有帮助.>我正在尝试使用重力值(TYPE_GraviTY)来制作点积,

  8. android – 不同移动设备中的加速度计和陀螺仪精度

    我想用移动设备的传感器实现室内定位系统.这个问题已经在几个地方讨论过,比如-here和here第一步是确定哪个平台是实现这样一个系统的最佳平台.主要的可能性是三星的galaxy/galaxy标签或iphone/ipad.最重要的标准是传感器数据的准确性.但是,这种比较非常复杂,因为精度不仅取决于设备本身,还取决于其上方的软件层.有没有关于这个问题的研究?智能手机和平板电脑的传感器之间有区别吗?任何指向网站或文章的链接都会非常有用提前致谢!

  9. Android在地球坐标系上获得加速度计

    ).我也是Android新手.我很感激你的帮助!我结合了2个先前的答案,这里是代码:1)获取地球坐标中的电话单元矢量2)反转矩阵以获得电话坐标中的地球单位矢量3)乘以单位矢量的手机加速度,将手机坐标转换为地球坐标.感谢大家的帮助!

  10. android – 滚动骰子的物理想法

    我想制作像骰子一样的滚动立方体,它对加速度计做出反应.因此,加速度计为立方体移动提供参数.我认为应该在这里使用小物理.我的问题是,在没有任何物理引擎的情况下,我应该使用什么公式,技术来完成解决方法您可能需要使用OpenGL.有一个很好的物理教程OGLhere特别是对于骰子,请看一下这个nokiademo.它是用cpp编写的(sourcehere)在物理方面,你可以看看thissite.无论如何,我

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部