IOS Core Motion、UIAccelerometer(加速计使用)

加速计

● 加速计的作用

● 用于检测设备的运动(比如摇晃)

● 加速计的经典应用场景

● 摇一摇

● 计步器

● 加速计程序的开发

● 在iOS4以前:使用UIAccelerometer,用法非常简单(到了iOS5就已经过期)

● 从iOS4开始:CoreMotion.framework

● 虽然UIAccelerometer已经过期,但由于其用法极其简单,很多程序里面都
还有残留

UIAccelerometer的使用步骤

● 获得单例对象

UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];

● 设置代理
accelerometer.delegate = self;

● 设置采样间隔

accelerometer.updateInterval = 1.0/30.0; // 1秒钟采样30次

● 实现代理方法

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:

(UIAcceleration *)acceleration

// acceleration中的x、y、z三个属性分别代表每个轴上的加速度

#import "ViewController.h"
#import "UIView+Extension.h"

@interface ViewController ()<UIAccelerometerDelegate>
/**
 *  小球
 */
@property (weak, nonatomic) IBOutlet UIImageView *imageBall;
/**
 *  保存速度
 */
@property (nonatomic, assign) CGPoint  velocity;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // 1.利用单利获取采集对象
    UIAccelerometer *acc = [UIAccelerometer sharedAccelerometer];
    // 2.设置代理
    acc.delegate = self;
    // 3.设置采样时间
    acc.updateInterval = 1 / 30;

}
#pragma mark -UIAccelerometerDelegate
// 4.实现代理方法
/**
 *  只要采集到数据就会调用(调用频率非常高)
 *
 *  @param accelerometer 触发事件的对象
 *  @param acceleration  获取到得数据
 */
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    NSLog(@"x = %f / y = %f / z = %f", acceleration.x, acceleration.y, acceleration.z);

    /*
     速度 = 加速度 * 时间
     V = at;  ==  a * t1 + a * t2 + a * t3 ....;
     */
    // 不能直接修改对象的结构体属性的成员
//    self.velocity.x += acceleration.x;
    _velocity.x += acceleration.x;
    // -=的原因是因为获取到得Y轴的加速度和UIKit的坐标系的Y的值是相反的, 而我们将来想让小球往加速度的反方向运动, 所以 -=;
    _velocity.y -= acceleration.y;

    /*

    移动的距离 = 速度 * 时间
    S = vt; == v * t1 + v * t2 + v * t3 ....;
     */
    self.imageBall.x += _velocity.x;
    self.imageBall.y += _velocity.y;

    // 边界检测
    if (self.imageBall.x <= 0) {
        // 矫正小球当前的位置
        self.imageBall.x = 0;
        // 超出了屏幕的左边
        _velocity.x *= -0.5;
    }
    if (self.imageBall.y <= 0) {
        // 矫正小球当前的位置
        self.imageBall.y = 0;
        // 超出屏幕的顶部
        _velocity.y *= -0.5;
    }

    if (CGRectGetMaxY(self.imageBall.frame) >= self.view.height) {
        // 矫正小球当前的位置
        self.imageBall.y = self.view.height - self.imageBall.height;
        // 查出屏幕的底部
        _velocity.y *= -0.5;
    }

    if (CGRectGetMaxX(self.imageBall.frame) >= self.view.width) {
        // 矫正小球当前的位置
        self.imageBall.x = self.view.width - self.imageBall.width;
        // 查出屏幕的右边
        _velocity.x *= -0.5;
    }

}
@end

Core Motion(iPhone4)

苹果特地在iOS4中增加了专门处理Motion的框架-CoreMotion.framework

Core Motion获取数据的两种方式

● push

● 实时采集所有数据(采集频率高)

● pull

● 在有需要的时候,再主动去采集数据

Core Motion的使用步骤(push)

● 创建运动管理者对象

CMMotionManager *mgr = [[CMMotionManager alloc] init];

● 判断加速计是否可用(最好判断)

if (mgr.isAccelerometerAvailable) {

// 加速计可用
}

● 设置采样间隔

mgr.accelerometerUpdateInterval = 1.0/30.0; // 1秒钟采样30次

● 开始采样(采样到数据就会调用handler,handler会在queue中执行)

- (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue

withHandler:(CMAccelerometerHandler)handler;

Core Motion的使用步骤(pull)

● 创建运动管理者对象

CMMotionManager *mgr = [[CMMotionManager alloc] init];

● 判断加速计是否可用(最好判断)

if (mgr.isAccelerometerAvailable) { // 加速计可用 }

● 开始采样

- (void)startAccelerometerUpdates;

● 在需要的时候采集加速度数据

CMAcceleration acc = mgr.accelerometerData.acceleration;
NSLog(@"%f, %f, %f", acc.x, acc.y, acc.z);


#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>

@interface ViewController ()
@property (nonatomic, strong) CMMotionManager *mgr;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.创建coreMotion管理者
    self.mgr = [[CMMotionManager alloc] init];

     if (self.mgr.isAccelerometerAvailable) {
          // 3.开始采样
         [self.mgr startAccelerometerUpdates]; // pull
     }else
     {
         NSLog(@"加速计不可用");
     }

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    CMAcceleration acceleration = self.mgr.accelerometerData.acceleration;

     NSLog(@"x = %f y = %f z = %f", acceleration.x, acceleration.y , acceleration.z);
}

- (void)push
{
    // 1.创建coreMotion管理者
    //    CMMotionManager *mgr = [[CMMotionManager alloc] init];
    self.mgr = [[CMMotionManager alloc] init];

    // 2.判断加速计是否可用
    if (self.mgr.isAccelerometerAvailable) {
        /*
         isAccelerometerActive 是否正在采集
         accelerometerData 采集到得数据
         startAccelerometerUpdates  pull
         startAccelerometerUpdatesToQueue  push
         stopAccelerometerUpdates 停止采集
         accelerometerUpdateInterval 采样时间
         */
        // 3.设置采样时间
        self.mgr.accelerometerUpdateInterval = 1 / 30.0;
        // 4.开始采样

        [self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
            // 这个block是采集到数据时就会调用
            if (error) return ;
            CMAcceleration acceleration = accelerometerData.acceleration;
            NSLog(@"x = %f y = %f z = %f", acceleration.x, acceleration.y , acceleration.z);
        }];
    }else
    {
        NSLog(@"加速计不可用");
    }
}

@end


 
时间: 2024-10-14 13:14:49

IOS Core Motion、UIAccelerometer(加速计使用)的相关文章

IOS 特定于设备的开发:Core Motion基础

Core Motion框架集中了运动数据处理.该框架是在IOS 4 SDK中引入的,用于取代accelerometer加速计访问.它提供了对3个关键的机载传感器的集中式监测.这些传感器有陀螺仪.磁力计和加速计组成,其中陀螺仪用于测量设备的旋转,磁力计提供了一种测量罗盘方位的方式,加速计用于监测沿着3根轴的重力变化.第四个入口点称为设备移动(device motion),他把全部3中传感器都结合进单个监测系统中. Core Motion使用来自这些传感器原始值创建可度的测量结果,主要表现为力向量的

iOS开发-CoreMotion框架(加速计和陀螺仪)

CoreMotion是一个专门处理Motion的框架,其中包含了两个部分加速度计和陀螺仪,在iOS4之前加速度计是由UIAccelerometer类来负责采集数据,现在一般都是用CoreMotion来处理加速度过程,不过由于UIAccelerometer比较简单,同样有人在使用.加速计由三个坐标轴决定,用户最常见的操作设备的动作移动,晃动手机(摇一摇),倾斜手机都可以被设备检测到,加速计可以检测到线性的变化,陀螺仪可以更好的检测到偏转的动作,可以根据用户的动作做出相应的动作,iOS模拟器无法模拟

iOS Core data多线程并发访问的问题

大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的特殊性,与大家分享一下. 这个问题似乎在7.0.1以前的版本上并不存在:不过后来我升级版本到了7.0.4.app的模型很简单,主线程在前台对数据库进行读写,而后台线程不断地做扫描(只读).为此每个线程中各创建了一个NSManagedObjectContext. 这个模型其实有点奇怪,因为普遍的模型是

iOS Core Animation 简明系列教程

iOS Core Animation 简明系列教程  看到无数的CA教程,都非常的难懂,各种事务各种图层关系看的人头大.自己就想用通俗的语言翻译给大家听,尽可能准确表达,如果哪里有问题,请您指出我会尽快修改. 1.什么是Core Animation? 它是一套包含图形绘制,投影,动画的OC类集合.它就是一个framework.通过CoreAnimation提供的接口,你可以方便完成自己所想要的动画. 2.我眼中的Core Animation? 动画和拍电影一样,而我们就如同导演一样,全权负责这场

IOS - CORE DATA的目录(xcode6)

? ?当使用coredata作为app的后台数据存储介质后,我们很想知道数据是否成功插入.为此,我想找到coredata.sqlite的文件 代码中指定的存储目录为: - (NSURL *)applicationDocumentsDirectory { ? ? ? return [[[NSFileManagerdefaultManager] URLsForDirectory:NSDocumentDirectoryinDomains:NSUserDomainMask] lastObject]; }

转 iOS Core Animation 动画 入门学习(一)基础

iOS Core Animation 动画 入门学习(一)基础 reference:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004514 在iOS中,每个view中都自动配置了一个layer,我们不能人为新建,而在Mac OS中,view默认是没有

iOS Core Animation Advanced Techniques(六): 基于定时器的动画和性能调优

基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇客帝国 在第10章“缓冲”中,我们研究了CAMediaTimingFunction,它是一个通过控制动画缓冲来模拟物理效果例如加速或者减速来增强现实感的东西,那么如果想更加真实地模拟 物理交互或者实时根据用户输入修改动画改怎么办呢?在这一章中,我们将继续探索一种能够允许我们精确地控制一帧一帧展示的基于定时器的动画. 定时帧 动画看起来是用来显示一段连续的运动过程,但实际上当在固定位置上展示像素的时候并不能做到这一点.一般来说这种显

IOS Core Animation Advanced Techniques的学习笔记(一)

转载. Book Description Publication Date: August 12, 2013 Core Animation is the technology underlying Apple’s iOS user interface. By unleashing the full power of Core Animation, you can enhance your app with impressive 2D and 3D visual effects and creat

IOS Core Animation Advanced Techniques的学习笔记(五)

第六章:Specialized Layers   类别 用途 CAEmitterLayer 用于实现基于Core Animation粒子发射系统.发射器层对象控制粒子的生成和起源 CAGradientLayer 用于绘制一个颜色渐变填充图层的形状(所有圆角矩形边界内的部分) CAEAGLLayer/CAOpenGLLayer 用于设置需要使用OpenGL ES(iOS)或OpenGL(OS X)绘制的内容与内容储备. CAReplicatorLayer 当你想自动生成一个或多个子层的拷贝.复制器