iOS 对iphone和 ipad的摄像头和图片库的区别处理代码

2024-03-13 08:48

本文主要是介绍iOS 对iphone和 ipad的摄像头和图片库的区别处理代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     iPhone跟 iPad对摄像头和图片库的代码处理有点不一样,iPad主要是用使用

UIPopoverController来包含 UIImagePickerController.


   主要的代码如下:

   1. 类从UIViewController继承,然后里面实现  UINavigationControllerDelegate跟 

UIImagePickerControllerDelegate。


   2.  将ios的appDelegate类  的laungh函数中,将相应的代码修改为:

    // Set RootViewController to windowif ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0){// warning: addSubView doesn't work on iOS6[window setRootViewController:viewController];[window addSubview: viewController.view];}else{// use this method on ios6[window setRootViewController:viewController];}

    主要目的是 当SDK< 6.0的时候,也设置  
[window setRootViewController:viewController];
   防止在后面取window.rootViewController的时候crash.



   3. *.h文件里面包含这么几个成员变量:

    

    UIImagePickerController* picker_camera_;UIImagePickerController* picker_library_;UIWindow * window;UIPopoverController  * pc_image_picker_;

   4. *.mm文件的内容如下:

@implementation IPHONEAvatarstatic IPHONEAvatar* _sharedIPHONEAvatar = nil;
static int _g_iImgIndex = 0;+(IPHONEAvatar*)sharedIPHONEAvatar {@synchronized([IPHONEAvatar class]){if(!_sharedIPHONEAvatar){[[self alloc] init];}return _sharedIPHONEAvatar;}return nil;
}+(id)alloc
{@synchronized ([IPHONEAvatar class]){NSAssert(_sharedIPHONEAvatar == nil,@"Attempted to allocated a second instance of the IPHONEAvatar singleton");_sharedIPHONEAvatar = [super alloc];return _sharedIPHONEAvatar;}return nil;
}- (void)imagePickerController:(UIImagePickerController*)picker
didFinishPickingImage:(UIImage*)image
editingInfo:(NSDictionary*)editingInfo
{NSMutableDictionary * dict= [NSMutableDictionary dictionaryWithDictionary:editingInfo];[dict setObject:image forKey:@"UIImagePickerControllerEditedImage"];[self imagePickerController:picker didFinishPickingMediaWithInfo:dict];
}-(void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo
{UNUSED(image);UNUSED(contextInfo);if (error) {CCLOG("saving pic error!");}
}- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{[picker.view removeFromSuperview];[picker dismissModalViewControllerAnimated:YES];[picker release];picker = nil;picker_camera_ = nil;picker_library_ = nil;if(window){[window removeFromSuperview];[window release];window = nil;}#ifdef   HD_EDITIONif (pc_image_picker_){[pc_image_picker_  dismissPopoverAnimated:YES];pc_image_picker_ = nil;}
#else#endif}//3.x  用户选中图片后的回调
- (void)imagePickerController:(UIImagePickerController*)picker
didFinishPickingMediaWithInfo:(NSDictionary*)info
{CCLOG("imagePickerController:");if (picker == picker_camera_) {//如果是 来自照相机的image,那么先保存UIImage* original_image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];UIImageWriteToSavedPhotosAlbum(original_image, self,@selector(image:didFinishSavingWithError:contextInfo:),nil);}UIImage* image = [info objectForKey: @"UIImagePickerControllerEditedImage"];NSError** error = 0;NSFileManager* fm = [NSFileManager defaultManager];NSString* my_avatar_temp_path = [NSString stringWithFormat:@"%@/Documents/MYAVATAR_TEMP%d.PNG", NSHomeDirectory(),_g_iImgIndex++];if ([fm fileExistsAtPath:my_avatar_temp_path]) {[fm removeItemAtPath:my_avatar_temp_path error:error];}//UIImage* avatar_image = [ImageHelper image:image fillView:avatar_];UIImage* avatar_image= nil;
#ifdef   HD_EDITIONavatar_image = [ImageHelper image:image fillSize:CGSizeMake(120.0f, 120.0f)];
#elseavatar_image = [ImageHelper image:image fillSize:CGSizeMake(120.0f, 120.0f)];
#endifNSData* imageData = UIImagePNGRepresentation(avatar_image);BOOL avatar_updated = NO;if (imageData) {BOOL bSuccess = [imageData writeToFile:my_avatar_temp_path atomically:YES];if (bSuccess){CCString strAvatarPath;strAvatarPath.initWithFormat("%s",[my_avatar_temp_path UTF8String]);CCLog("strAvatarPath: %s",strAvatarPath.getCString());CCNotificationCenter::sharedNotificationCenter()->postNotification(AVATARCHANGE,&strAvatarPath);}else{CCLog("Failed to save picture");}avatar_updated = bSuccess;}[picker.view removeFromSuperview];[picker dismissModalViewControllerAnimated:YES];[picker release];picker = nil;picker_camera_ = nil;picker_library_ = nil;if (window){[window removeFromSuperview];[window release];window = nil;}#ifdef   HD_EDITIONif (pc_image_picker_){[pc_image_picker_  dismissPopoverAnimated:YES];pc_image_picker_ = nil;}
#else#endif// upload new avatar to serverif (avatar_updated){std::string avatar_hash = getImageFileHashValue([my_avatar_temp_path UTF8String]) + ".png";NSString* my_avatar_path = [NSString stringWithFormat:@"%@/Documents/%s", NSHomeDirectory(), avatar_hash.c_str()];if ([fm fileExistsAtPath:my_avatar_path]){[fm removeItemAtPath:my_avatar_path error:error];}[fm moveItemAtPath: my_avatar_temp_pathtoPath: my_avatar_patherror: error];CCString strFileName;strFileName.initWithFormat("%s",[my_avatar_path UTF8String]);std::string   strUploading = LanguageManager::sharedLanguageManager()->getLocalizedString("uploading avatar,please waiting...");UIAlertView *    baseAlert = [[[UIAlertView alloc] initWithTitle:[NSString  stringWithUTF8String:strUploading.c_str()] message:nildelegate:self cancelButtonTitle:nil otherButtonTitles:nil] autorelease];[baseAlert show];std::string  strOk =  LanguageManager::sharedLanguageManager()->getLocalizedString("OK");if (AvatarManager::sharedAvatarManager()->uploadFile(strFileName) ){[baseAlert   dismissWithClickedButtonIndex:0 animated:YES];std::string   strUploadSuccess = LanguageManager::sharedLanguageManager()->getLocalizedString("upload avatar  success!");UIAlertView* av = [[[UIAlertView alloc] initWithTitle:@"tip" message:[NSString  stringWithUTF8String:strUploadSuccess.c_str()] delegate:self cancelButtonTitle:[NSString stringWithUTF8String:strOk.c_str()] otherButtonTitles:nil] autorelease];[av show];}else{[baseAlert   dismissWithClickedButtonIndex:0 animated:YES];std::string   strUploadFailed = LanguageManager::sharedLanguageManager()->getLocalizedString("upload avatar  failed!");UIAlertView* av = [[[UIAlertView alloc] initWithTitle:@"tip" message:[NSString  stringWithUTF8String:strUploadFailed.c_str()] delegate:self cancelButtonTitle: [NSString stringWithUTF8String:strOk.c_str()] otherButtonTitles:nil] autorelease];[av show];AnalyticX::flurryLogError(FLURRY_UPLOAD_AVATAR, "UPLOAD_AVATAR_FAILED");}}}-(void)onIPHONECamera
{if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {picker_camera_ = [[UIImagePickerController alloc] init];
#ifdef   HD_EDITIONpicker_camera_.sourceType = UIImagePickerControllerSourceTypeCamera;if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]){picker_camera_.cameraDevice = UIImagePickerControllerCameraDeviceFront;}else{picker_camera_.cameraDevice = UIImagePickerControllerCameraDeviceRear;}picker_camera_.allowsEditing = YES;picker_camera_.delegate = self;#elsepicker_camera_.sourceType = UIImagePickerControllerSourceTypeCamera;if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]){picker_camera_.cameraDevice = UIImagePickerControllerCameraDeviceFront;}else{picker_camera_.cameraDevice = UIImagePickerControllerCameraDeviceRear;}picker_camera_.allowsEditing = YES;picker_camera_.delegate = self;#endif     #ifdef   HD_EDITIONpicker_camera_.view.frame = [UIScreen mainScreen].bounds;window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];window.rootViewController = picker_camera_;//self;if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0){// warning: addSubView doesn't work on iOS6[window addSubview: picker_camera_.view];}else{// use this method on ios6[window setRootViewController:picker_camera_];//self];}[window makeKeyAndVisible];
#elsepicker_camera_.view.frame = [UIScreen mainScreen].bounds;window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];window.rootViewController = picker_camera_;//self;if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0){// warning: addSubView doesn't work on iOS6[window addSubview: picker_camera_.view];}else{// use this method on ios6[window setRootViewController:picker_camera_];//self];}[window makeKeyAndVisible];
#endif}else{//提示摄像头无法用}
}-(void)onIPHONEAlbum
{picker_library_ = [[UIImagePickerController alloc] init];
#ifdef HD_EDITIONpicker_library_.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;picker_library_.allowsEditing = YES;picker_library_.delegate = self;#elsepicker_library_.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;picker_library_.allowsEditing = YES;picker_library_.delegate = self;#endif #ifdef HD_EDITIONCGSize  libSize  =  picker_library_.view.frame.size;//libSize = CGSizeMake(160/2, 160/2);pc_image_picker_ = [[UIPopoverController alloc] initWithContentViewController:picker_library_];if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0){CCLog("systemVersion<6.0");}else{CCLog("systemVersion>=6.0");}[pc_image_picker_ presentPopoverFromRect:CGRectMake(57/2, 352/2, libSize.width, libSize.height) inView:[[UIApplication sharedApplication] keyWindow].rootViewController.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];#else[[[UIApplication sharedApplication] keyWindow] addSubview:picker_library_.view];
#endif}@end

具体细节就不说了,主要是区分iPhone和iPad,然后区分 SDK6.0以上跟 6.0以下。


这篇关于iOS 对iphone和 ipad的摄像头和图片库的区别处理代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/804293

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本