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

简介: 1、关于iOS设备上的摄像头 实现在摄像头上获取图像的方法:使用UIImagePickerController。这个视图控制器不使用storyboard生成,因此需要使用alloc、init方法手动建立。

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和UIApplicationWillResignActive Notification。可以使用这两个消息用于暂停和重启应用。

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

- (void)applicationDidEnterBackground:(UIApplication *)sender;
- (void)applicationWillEnterForgound:(UIApplication *)sender;
并发送 UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForgroundNotification。
除此之外还有其他代理方法,如本地消息、UI恢复状态、数据保护、打开URL等。



目录
相关文章
|
1月前
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
182 60
|
1月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
160 4
|
1月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
1月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
33 2
|
1月前
|
开发框架 前端开发 Android开发
探索安卓和iOS应用开发中的跨平台解决方案
【10月更文挑战第42天】在移动应用开发的广阔天地中,安卓和iOS系统如同两座巍峨的山峰,分别占据着半壁江山。开发者们在这两座山峰之间穿梭,努力寻找一种既能节省资源又能提高效率的跨平台开发方案。本文将带你走进跨平台开发的世界,探讨各种解决方案的优势与局限,并分享一些实用的代码示例,助你在应用开发的道路上更加游刃有余。
|
1月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
1月前
|
Android开发 Swift iOS开发
探索iOS与安卓应用开发的差异性
探索iOS与安卓应用开发的差异性
49 2
|
1月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
59 1
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
62 5
|
1月前
|
开发工具 Android开发 Swift
探索iOS与安卓应用开发的异同点
【10月更文挑战第24天】本文通过比较iOS和安卓开发环境,旨在揭示两大移动平台在开发过程中的相似性与差异性。我们将探讨开发工具、编程语言、用户界面设计、性能优化及市场分布等方面,以期为开发者提供全面的视角。通过深入浅出的分析,文章将帮助读者更好地理解每个平台的独特之处及其对应用开发的影响。