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,y,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
import CoreMotion
 
class ViewController: UIViewController,UIAccelerometerDelegate {
     
    var ball:UIImageView!
    var speedX:UIAccelerationValue=0
    var speedY:UIAccelerationValue=0
    var motionManager = CMMotionManager()
     
    override func viewDidLoad() {
        super.viewDidLoad()
        //放一个小球在中央
        ball=UIImageView(image:UIImage(named:"ball"))
        ball.frame=CGRectMake(0,0,50,50)
        ball.center=self.view.center
        self.view.addSubview(ball)
         
        motionManager.accelerometerUpdateInterval = 1/60
         
        if(motionManager.accelerometerAvailable)
        {
            var queue = NSOperationQueue.currentQueue()
            motionManager.startAccelerometerUpdatesToQueue(queue, withHandler:
            {(accelerometerData : CMAccelerometerData!, error : NSError!) in
                 
                //动态设置小球位置
                self.speedX += accelerometerData.acceleration.x
                self.speedY +=  accelerometerData.acceleration.y
                var posX=self.ball.center.x + CGFloat(self.speedX)
                var posY=self.ball.center.y - CGFloat(self.speedY)
                //碰到边框后的反弹处理
                if posX<0 {
                    posX=0;
                    //碰到左边的边框后以0.4倍的速度反弹
                    self.speedX *= -0.4
                     
                }else if posX > self.view.bounds.size.width {
                    posX=self.view.bounds.size.width
                    //碰到右边的边框后以0.4倍的速度反弹
                    self.speedX *= -0.4
                }
                if posY<0 {
                    posY=0
                    //碰到上面的边框不反弹
                    self.speedY=0
                } else if posY>self.view.bounds.size.height{
                    posY=self.view.bounds.size.height
                    //碰到下面的边框以1.5倍的速度反弹
                    self.speedY *= -1.5
                }
                self.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
import CoreMotion
 
class ViewController: UIViewController,UIAccelerometerDelegate {
     
    var ball:UIImageView!
    var speedX:UIAccelerationValue=0
    var speedY:UIAccelerationValue=0
    var motionManager = CMMotionManager()
     
    override func viewDidLoad() {
        super.viewDidLoad()
        //放一个小球在中央
        ball=UIImageView(image:UIImage(named:"ball"))
        ball.frame=CGRectMake(0,0,50,50)
        ball.center=self.view.center
        self.view.addSubview(ball)
         
        motionManager.accelerometerUpdateInterval = 1/60
         
        if(motionManager.accelerometerAvailable)
        {
            let queue = NSOperationQueue.currentQueue()
            motionManager.startAccelerometerUpdatesToQueue(queue!, withHandler:
                { (accelerometerData : CMAccelerometerData?, error: NSError?) -> Void in
                 
                //动态设置小球位置
                self.speedX += accelerometerData!.acceleration.x
                self.speedY +=  accelerometerData!.acceleration.y
                var posX=self.ball.center.x + CGFloat(self.speedX)
                var posY=self.ball.center.y - CGFloat(self.speedY)
                //碰到边框后的反弹处理
                if posX<0 {
                    posX=0;
                    //碰到左边的边框后以0.4倍的速度反弹
                    self.speedX *= -0.4
                     
                }else if posX > self.view.bounds.size.width {
                    posX=self.view.bounds.size.width
                    //碰到右边的边框后以0.4倍的速度反弹
                    self.speedX *= -0.4
                }
                if posY<0 {
                    posY=0
                    //碰到上面的边框不反弹
                    self.speedY=0
                } else if posY>self.view.bounds.size.height{
                    posY=self.view.bounds.size.height
                    //碰到下面的边框以1.5倍的速度反弹
                    self.speedY *= -1.5
                }
                self.ball.center=CGPointMake(posX,posY)
            })
        }
    }
}

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

  1. Swift - 委托(delegate)的介绍,及使用样例

    1,委托的说明 委托(delegate)是Cocoa的一个术语,表示将一个对象的部分功能转交给另一个对象. 比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象B的引用存为一个实例变量 ...

  2. 加速传感器(CoreMotion) swift

    // // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...

  3. Swift - 继承UIView实现自定义可视化组件(附记分牌样例)

    在iOS开发中,如果创建一个自定义的组件通常可以通过继承UIView来实现.下面以一个记分牌组件为例,演示了组件的创建和使用,以及枚举.协议等相关知识的学习. 效果图如下:    组件代码:Score ...

  4. Swift - 自动布局库SnapKit的使用详解4(样例1:实现一个登录页面)

    前面的几篇文章讲解了自动布局库SnapKit的使用方法.本文通过一个完整的样例(登录页面)来演示在实际项目中如何使用SnapKit来实现自动化布局的.1,效果图如下

  5. Android 获取加速传感器的值,并去除杂音

    1.注册和注销传感器 private void registerSensor() { manager.registerListener(this, manager.getDefaultSensor(S ...

  6. 设备加速传感器(accelerometer) ---- HTML5+

    模块:Accelerometer Accelerometer模块管理设备加速度传感器,用于获取设备加速度信息,包括x(屏幕水平方向).y(垂直屏幕水平方向).z(垂直屏幕平面方向)三个方向的加速度信息 ...

  7. Pro Android学习笔记(一五四):传感器(4):陀螺仪、加速传感器

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处http://blog.csdn.net/flowingflying/以及作者@恺风Wei. 陀螺仪 陀螺仪(Gyr ...

  8. Swift - 使用socket进行通信(附聊天室样例)

    在Swift开发中,如果我们需要保持客服端和服务器的长连接进行双向的数据通信,使用socket是一种很好的解决方案. 下面通过一个聊天室的样例来演示socket通信,这里我们使用了一个封装好的sock ...

  9. Swift语言 简明基础 代码演示样例

    开发环境: Mac.Xcode6.0 下面内容均可创建ios common line项目来測试 1.Hello World演示样例 使用xcode创建新的common line项目,查看主文件main ...

随机推荐

  1. 高级UIKit-07(AVAudioPlayer)

    [day09-1-AVAudioPlayer]:播放音乐案例 实现多媒体需要准备以下两点: 需要引入一个框架AVFoundation.framework 然后引入#import <AVFound ...

  2. Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart

    之前都是命令行创建,今天用eclipse装m2eclipse的时候装完后创建项目的时候报错: Could not resolve archetype org.apache.maven.archetyp ...

  3. RAID级别与规范

    1.RAID 0 RAID 0是最早出现的RAID模式,即Data Stripping数据分条技术.RAID 0是组建磁盘阵列中最简单的一种形式,只需要2块以上的硬盘即可,成本低,可以提高整个磁盘的性 ...

  4. 更好地认知Azure

    编辑人员注释:本文章由 Windows Azure 网站团队项目经理 Erez Benari 撰写. 我们的网站 http://www.windowsazure.com 包含大量信息,并且也在不断添加 ...

  5. 蛋疼的Apple IOS Push通知协议

    简单介绍 Apple Push通知机制事实上非常easy,就是Apple的APNsserver做为中间人,把消息推送到相应的设备上. 一张来自Apple文档的图: 当然,示意图看起来简单,可是另一些实 ...

  6. 调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment之我的解决方法

    private class ViewPagerAdapter extends FragmentPagerAdapter {      FragmentManager mFragmentManager; ...

  7. mysql学习之中的一个:mysql安装

    我用的时mac系统,本来想在mac系统上装一个,可是发现mac系统始终无法用password登入到本机server,很奇怪的问题(在stackflow上看了些回复,也没有找到原因),最后仅仅好装到虚拟 ...

  8. check————身份证

    -- Access 不支持 Substring 查询,可以替换为 mid 查询. select 序号,姓名,身份证号,性别from 身份表where (len(身份证号)<>15 and ...

  9. Oracle 创建索引的基本规则总结

    1.  选择索引字段的原则: 在WHERE子句中最频繁使用的字段 联接语句中的联接字段 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好) Oracle在UNIQUE和主键字 ...

  10. 6月19日 NSFileHandle文件类的常用方法

       NSFileManager类主要对文件的操作(删除,修改,移动,复制等):    NSFileHandle类主要对文件内容进行读取和写入操作    NSFileHandle处理文件的步骤     ...