iOS7应用开发17:摄像、Core Motion和应用实例的代理

1、关于iOS设备上的摄像头

实现在摄像头上获取图像的方法:使用UIImagePickerController。这个视图控制器不使用storyboard生成,因此需要使用alloc、init方法手动建立。显示这个ViewController的方法需要调用presentViewController::animated:completion。执行步骤:①建立视图控制器实例,并设置代理;②配置(数据源、媒体类型、是否可编辑);③显示视图控制器;④完成获取图像后有代理的方法响应。

具体实现例子:

UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; //表示希望通过摄像头拍摄图像
if(![UIImagePickerController isSourceTypeAvailable:sourceType])//检测当前设备是否支持获取指定媒体类型的数据
{
	sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
}

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];//新建UIIPC实例
imagePickerController.delegate = self;   // 设置委托为当前类
imagePickerController.sourceType = sourceType;//指定媒体类型
imagePickerController.allowsEditing = YES;//设置为可以编辑
[self presentViewController:imagePickerController animated:YES completion:nil];  //需要以模态的形式展示
[imagePickerController release];

拍摄(或读取)图像完成后,还需调用delegate方法执行后续操作:

#pragma mark -
#pragma mark UIImagePickerController Method
//完成拍照
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [picker dismissViewControllerAnimated:YES completion:^{}];
    UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
    if (image == nil)
        image = [info objectForKey:UIImagePickerControllerOriginalImage];

    [self performSelector:@selector(saveImage:) withObject:image];

}
//用户取消拍照
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [picker dismissViewControllerAnimated:YES completion:nil];
}

//将照片保存到disk上
-(void)saveImage:(UIImage *)image
{

    NSData *imageData = UIImagePNGRepresentation(image);
    if(imageData == nil)
    {
        imageData = UIImageJPEGRepresentation(image, 1.0);
    }

    NSDate *date = [NSDate date];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyyMMddHHmmss"];
    _fileName = [[[formatter stringFromDate:date] stringByAppendingPathExtension:@"png"] retain];

    NSURL *saveURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:_fileName];

    [imageData writeToURL:saveURL atomically:YES];
}

2、Core Motion简介

Core Motion代表了iOS设备中的陀螺仪等模块,其提供的API可以调用设备的动作传感器,检测当前设备的动作状态。实现该功能的类为CMMotionManager,该类同样适用alloc、init创建,但是一个app中只能有一个该类的实例。该对象可认为是一个全局资源。

适用方法:①检测硬件是否支持;②启动传感器获取数据;③检测是否正在获取数据;④停止传感器;

(1)加速度

//获取三维加速度
    CMAccelerometerData *newestAccel = motionManager.accelerometerData;
    double accelerationX = newestAccel.acceleration.x;
    double accelerationY = newestAccel.acceleration.y;
    double accelerationZ = newestAccel.acceleration.z;

(2)各个方向的重力以及设备倾斜角

    double gravityX = motionManager.deviceMotion.gravity.x;
    double gravityY = motionManager.deviceMotion.gravity.y;
    double gravityZ = motionManager.deviceMotion.gravity.z;
    double zTheta = atan2(gravityZ,sqrtf(gravityX*gravityX+gravityY*gravityY))/M_PI*180.0;//与水平面的角度
    double xyTheta = atan2(gravityX,gravityY)/M_PI*180.0;//设备自身旋转的角度

(3)陀螺仪数据

角速度:

    CMRotationRate rotationRate = motionManager.deviceMotion.rotationRate;
    double rotationX = rotationRate.x;
    double rotationY = rotationRate.y;
    double rotationZ = rotationRate.z;

空间位置的欧拉角

    double roll    = motionManager.deviceMotion.attitude.roll;
    double pitch   = motionManager.deviceMotion.attitude.pitch;
    double yaw     = motionManager.deviceMotion.attitude.yaw;

空间位置的四元数

   double w = motionManager.deviceMotion.attitude.quaternion.w;
   double wx = motionManager.deviceMotion.attitude.quaternion.x;
   double wy = motionManager.deviceMotion.attitude.quaternion.y;
   double wz = motionManager.deviceMotion.attitude.quaternion.z;

3、应用的状态

当应用UI开始/停止接收消息时,应用的代理会分别调用以下方法:

- (void)applicationDidBecomeActive:(UIApplication *)sender;
- (void)applicationWillResignActive:(UIApplication *)sender;

同时将会发送两条广播消息:UIApplicationDidBecomeActiveNotification和UIApplicationWillResignActiveNotification。可以使用这两个消息用于暂停和重启应用。

当应用进入后台时/从后台重启时,会调用:

- (void)applicationDidEnterBackground:(UIApplication *)sender;
- (void)applicationWillEnterForgound:(UIApplication *)sender;

并发送UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForgroundNotification。
除此之外还有其他代理方法,如本地消息、UI恢复状态、数据保护、打开URL等。

时间: 2024-09-28 14:01:45

iOS7应用开发17:摄像、Core Motion和应用实例的代理的相关文章

《iOS 6高级开发手册(第4版)》——1.10节秘诀:Core Motion基础

1.10 秘诀:Core Motion基础 iOS 6高级开发手册(第4版) Core Motion框架集中了运动数据处理.该框架是在iOS 4 SDK中引入的,用于取代你刚才阅读到的直接加速计访问.它提供了对3个关键的机载传感器的集中式监测.这些传感器由陀螺仪.磁力计和加速计组成,其中陀螺仪用于测量设备的旋转,磁力计提供了一种测量罗盘方位的方式,加速计用于检测沿着3根轴的重力变化.第四个入口点称为设备移动(device motion),它把全部3种传感器都结合进单个监测系统中. Core Mo

iOS7应用开发1、菜鸟那点儿事儿

序:今天开始新开一个坑,作为一个准备了许久却依然摆脱不了24k纯菜鸟身份的程序员,跟随Stanford的世界未来精英们一起学习iOS7应用开发的相关知识,同时也是为了自己以后的业余项目做准备,提升自己的工作筹码.我所follow的教程来自itunes上面斯坦福大学的公开课程<Developing iOS 7 Apps for iPhone and iPad>,很容易就能找到.这些博客除了作为追课过程中的笔记之外,可能也会有搜集到的与这次课相关的一些资料,和一些个人体会.只作为自己的记录,不敢保

SQLServer · 最佳实践 · 开发基于.NET CORE的LINUX版本的数据库应用

title: SQLServer · 最佳实践 · 开发基于.NET CORE的LINUX版本的数据库应用 author: 石沫 背景 最近有客户在基于.NET CORE的LINUX版本连接数据库的应用程序,在开发中,会遇到一些问题,客户会错误地将原因定位到我们的SQL SERVER,陆续收到一些工单,因此,我们需要有计划增强这个方面的能力,同事正确引导用户使用SQL SERVER. 部署环境 1. 服务器版本:ubuntu 14.04 2. .NET CORE 版本:1.0 3. 安装过程 3

VS 2017开发ASP.NET Core Web应用过程中发现的一个重大Bug

今天试着用VS 2017去开发一个.net core项目,想着看看.net core的开发和MVC5开发有什么区别,然后从中发现了一个VS2017的Bug. 首先,我们新建项目,ASP.NET Core Web应用程序,如图: 新建好后,我们按照习惯,在controller文件夹上面,点击鼠标右键,添加控制器...,出现了如下界面:   这个对话框什么意思呢?怎么会提示添加依赖项呢?按理来说,我们直接调试运行,项目就跑起来了!!! 先不管他,我们直接点击添加,然后稍等一会儿,等他添加依赖.完成后

【Spring开发】—— Spring Core

前言 最近由于一些工作的需要,还有自己知识的匮乏再次翻开spring.正好整理了一下相关的知识,弥补了之前对spring的一些错误认知.这一次学习,更加深入的理解了Ioc和AOP的思想,并对其架构模块有了更深一步的理解. 刚开始翻看spring技术内幕,虽然有了一点看源码的经验,但是直接看如此深的源码,还是很头疼.spring由于业务的扩展,以及用户群的增加,对于某些模块的类封装的很深!因此追溯源码是个很头疼的问题,而直接看这本书,也是压力山大. 于是回去复习一下spring的基本知识,先学会走

关于使用Spring和hibernate开发web程序的配置说明和简单实例的详细说明

关于使用Spring和hibernate开发web程序的配置说明和简单实例的详细说明 作者:yanekemail:yanek@126.com 一.实现目标: 通过使用spring和hibernate,实现用户的添加功能.把用户信息加入到数据库中使用Spring 的hibernate模板实现DAO操作. 最终效果: 浏览器中输入 http://localhost:8083/hibernateTestWeb/user.do 数据库就增加一条记录. 二.分层结构 系统采用如下分层结构 1.WEB层:用

Windows7下PHP开发环境安装配置图文方法_php实例

      操作系统:Windows 7 Ultimate       WEB服务器:IIS 6.1(内部版本7600).       数据库:MySql5.0.67       PHP版本:5.2.13       我还担心Win7下可能会不兼容,结果是一点问题都没有.    一.安装MySql数据库       MySql数据库在这里下载:http://www.mysql.com/downloads/ 客户端工具Navicat(导航猫)在这里下载:http://www.navicat.com

升级core data 时,这个persistentStoreCoordinator代理是哪个

问题描述 升级core data 时,这个persistentStoreCoordinator代理是哪个 Do you have NSMigratePersistentStoresAutomaticallyOption and NSInferMappingModelAutomaticallyOption options set when you create your persistentStoreCoordinator in the App Delegate?

开发中常用的验证固定电话号码实例

下面提供二款开发中常用的验证固定电话号码实例,可以验证手机号与电话号码,同时验证固定电话号码 0d{2,3} 代表区号 [0+]d{2,3} 代表国际区号 d{7,8} 代表7-8位数字(表示电话号码) . function check_phone(obj){ var reg=/^(([0+]d{2,3}-)?(0d{2,3})-)?(d{7,8})(-(d{3,}))?$/; if(obj.value!=""&&!reg.test(obj.value)){ alert