ios照片获取、拍照功能

简介:
//
//  HYBPhotoPickerManager.h
//  ehui
//
//  Created by 黄仪标 on 14/11/26.
//  Copyright (c) 2014年 黄仪标. All rights reserved.
//

#import <Foundation/Foundation.h>

/*!
 * @brief 照片获取或者拍照功能管理器
 * @author huangyibiao
 */
@interface HYBPhotoPickerManager : NSObject 

+ (HYBPhotoPickerManager *)shared;


/*!
 * @brief 选择图片或者拍照完成选择使用拍照的图片后,会调用此block
 * @param image 选择的图片或者拍照后选择使用的图片
 */
typedef void (^HYBPickerCompelitionBlock)(UIImage *image);
/*!
 * @brief 用户点击取消时的回调block
 */
typedef void (^HYBPickerCancelBlock)();

/*!
 * @brief 此方法为调起选择图片或者拍照的入口,当选择图片或者拍照后选择使用图片后,回调completion,
 *        当用户点击取消后,回调cancelBlock
 * @param inView UIActionSheet呈现到inView这个视图上
 * @param fromController 用于呈现UIImagePickerController的控制器
 * @param completion 当选择图片或者拍照后选择使用图片后,回调completion
 * @param cancelBlock 当用户点击取消后,回调cancelBlock
 */
- (void)showActionSheetInView:(UIView *)inView
               fromController:(UIViewController *)fromController
                   completion:(HYBPickerCompelitionBlock)completion
                  cancelBlock:(HYBPickerCancelBlock)cancelBlock;

@end


//
//  HYBPhotoPickerManager.m
//  ehui
//
//  Created by 黄仪标 on 14/11/26.
//  Copyright (c) 2014年 黄仪标. All rights reserved.
//

#import "HYBPhotoPickerManager.h"
#import "UIImagePickerController+Photo.h"
#import "UIImage+DSResizeAndRound.h"

@interface HYBPhotoPickerManager () <UIImagePickerControllerDelegate,
UINavigationControllerDelegate,
UIActionSheetDelegate>

@property (nonatomic, weak)     UIViewController          *fromController;
@property (nonatomic, copy)     HYBPickerCompelitionBlock completion;
@property (nonatomic, copy)     HYBPickerCancelBlock      cancelBlock;

@end

@implementation HYBPhotoPickerManager

+ (HYBPhotoPickerManager *)shared {
  static HYBPhotoPickerManager *sharedObject = nil;
  static dispatch_once_t onceToken;
  
  dispatch_once(&onceToken, ^{
    if (!sharedObject) {
      sharedObject = [[[self class] alloc] init];
    }
  });
  
  return sharedObject;
}

- (void)showActionSheetInView:(UIView *)inView
               fromController:(UIViewController *)fromController
                   completion:(HYBPickerCompelitionBlock)completion
                  cancelBlock:(HYBPickerCancelBlock)cancelBlock {
  self.completion = [completion copy];
  self.cancelBlock = [cancelBlock copy];
  self.fromController = fromController;
  
  dispatch_async(kGlobalThread, ^{
    UIActionSheet *actionSheet = nil;
    if ([UIImagePickerController isCameraAvailable]) {
      actionSheet  = [[UIActionSheet alloc] initWithTitle:nil
                                                 delegate:(id<UIActionSheetDelegate>)self
                                        cancelButtonTitle:@"取消"
                                   destructiveButtonTitle:nil
                                        otherButtonTitles:@"从相册选择", @"拍照上传", nil];
    } else {
      actionSheet = [[UIActionSheet alloc] initWithTitle:nil
                                                delegate:(id<UIActionSheetDelegate>)self
                                       cancelButtonTitle:@"取消"
                                  destructiveButtonTitle:nil
                                       otherButtonTitles:@"从相册选择", nil];
    }
    
    dispatch_async(kMainThread, ^{
      [actionSheet showInView:inView];
    });
  });
  
  return;
}

#pragma mark - UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
  if (buttonIndex == 0) { // 从相册选择
    if ([UIImagePickerController isPhotoLibraryAvailable]) {
      UIImagePickerController *picker = [[UIImagePickerController alloc] init];
      picker.delegate = self;
      picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
      picker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:picker.sourceType];
      
      if (kIsIOS7OrLater) {
        picker.navigationBar.barTintColor = self.fromController.navigationController.navigationBar.barTintColor;
      }
      // 设置导航默认标题的颜色及字体大小
      picker.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor],
                                                   NSFontAttributeName : [UIFont boldSystemFontOfSize:18]};
      [self.fromController presentViewController:picker animated:YES completion:nil];
    }
  } else if (buttonIndex == 1) { // 拍照
    if ([UIImagePickerController canTakePhoto]) {
      UIImagePickerController *picker = [[UIImagePickerController alloc] init];
      picker.delegate = self;
      picker.sourceType = UIImagePickerControllerSourceTypeCamera;
      picker.delegate = self;
      if (kIsIOS7OrLater) {
        picker.navigationBar.barTintColor = self.fromController.navigationController.navigationBar.barTintColor;
      }
      // 设置导航默认标题的颜色及字体大小
      picker.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor],
                                                   NSFontAttributeName : [UIFont boldSystemFontOfSize:18]};
      [self.fromController presentViewController:picker animated:YES completion:nil];
    }
  }
  return;
}

#pragma mark - UIImagePickerControllerDelegate
// 选择了图片或者拍照了
- (void)imagePickerController:(UIImagePickerController *)aPicker didFinishPickingMediaWithInfo:(NSDictionary *)info {
  [aPicker dismissViewControllerAnimated:YES completion:nil];
  __block UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
  
  if (image && self.completion) {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    [self.fromController setNeedsStatusBarAppearanceUpdate];
    
    dispatch_async(kGlobalThread, ^{
      image = [image imageResizedToSize:CGSizeMake(kScreenWidth / 2.0, kScreenHeight / 2.0)];
      DDLogVerbose(@"image size : %@", NSStringFromCGSize(image.size));
      
      dispatch_async(kMainThread, ^{
        self.completion(image);
      });
    });
  }
  return;
}

// 取消
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)aPicker {
  [aPicker dismissViewControllerAnimated:YES completion:nil];
  
  if (self.cancelBlock) {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    [self.fromController setNeedsStatusBarAppearanceUpdate];
    
    self.cancelBlock();
  }
  return;
}

@end


目录
相关文章
|
7月前
|
存储 数据建模 iOS开发
iOS设备功能和框架: 什么是 Core Data,它在 iOS 中的作用是什么?
iOS设备功能和框架: 什么是 Core Data,它在 iOS 中的作用是什么?
108 1
|
7月前
|
定位技术 iOS开发
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
78 0
|
监控 Android开发 iOS开发
盘点一对一直播源码iOS系统维持平台稳定功能(一):弹性扩缩容
参考代码:弹性扩缩容如何实现?System.out.println("扩容:增加直播平台实例"); currentCapacity++; } private void scaleDown() { System.out.println("缩容:减少直播平台实例");
盘点一对一直播源码iOS系统维持平台稳定功能(一):弹性扩缩容
|
移动开发 安全 前端开发
提升iOS应用安全性:全面代码混淆功能介绍,使用Ipa Guard保护你的应用
iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护,防止应用程序中的代码及资源文件被恶意篡改。Ipa Guard通过修改 ipa 文件中的 macho 文件中二进制数据(代码模块配置)进行操作,无需源码。不限定开发技术平台。支持oc,swift,cocos2d-x、unity3d、quick-cocos,html5 ,react native等等各种开发技术。Ipa Guard主要包含代码混淆全面、资源文件处理、不需要源代码更安全、调试信息清理、即时测试运行。
|
2月前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
52 3
|
5月前
|
人工智能 搜索推荐 iOS开发
苹果发布iOS 18 Beta 4,新增CarPlay 壁纸等多项功能改进
本文首发于公众号“AntDream”,探索iOS 18 Beta 4新功能与改进: CarPlay壁纸、iCloud设置访问优化、相机控制记忆、隐藏文件夹设计变更、深色/浅色模式图标同步、股票应用图标调整、iPhone镜像功能增强、控制中心蓝牙切换键、AssistiveTouch新增Type to Siri等,以及Apple Intelligence暗示。开发者可通过苹果计划提前体验。
105 12
|
7月前
|
存储 Web App开发 Android开发
iOS不支持WebP格式图片解决方案和iPhone 7及其后硬件拍照的HEIC格式图片
iOS不支持WebP格式图片解决方案和iPhone 7及其后硬件拍照的HEIC格式图片
679 1
iOS不支持WebP格式图片解决方案和iPhone 7及其后硬件拍照的HEIC格式图片
|
7月前
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
305 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能
|
7月前
|
机器学习/深度学习 PyTorch TensorFlow
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
187 0
|
7月前
|
iOS开发
iOS设备功能和框架: 如何使用 Core Animation 创建动画效果?
iOS设备功能和框架: 如何使用 Core Animation 创建动画效果?
143 0