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


目录
相关文章
|
移动开发 前端开发 Android开发
前端html input =“file“ ios/安卓解决无法选择图库/拍照问题
前端html input =“file“ ios/安卓解决无法选择图库/拍照问题
1627 0
|
移动开发 前端开发 iOS开发
记录一下前端H5的复制功能在ios端的兼容性问题
记录一下前端H5的复制功能在ios端的兼容性问题
697 0
|
iOS开发
IOS - iOS 12 的“隐式推送”功能怎么用?
IOS - iOS 12 的“隐式推送”功能怎么用?
326 0
IOS - iOS 12 的“隐式推送”功能怎么用?
|
11月前
|
iOS开发
iOS开发 自拍及照片镜面翻转问题解决办法
iOS开发 自拍及照片镜面翻转问题解决办法
200 0
|
安全 Linux 网络安全
【IOS实用玩机技巧】爱思助手 IPA 签名功能常见问题汇总(iOS上架)
【IOS实用玩机技巧】爱思助手 IPA 签名功能常见问题汇总(iOS上架)
2285 0
【IOS实用玩机技巧】爱思助手 IPA 签名功能常见问题汇总(iOS上架)
|
存储 Swift iOS开发
iOS - 调用相机连续拍照
iOS - 调用相机连续拍照
103 0
|
iOS开发
IOS调取系统摄像头并拍照
IOS调取系统摄像头并拍照
101 0
|
存储 iOS开发
超好用iOS管软件iMazing 2.16.6官网下载及2023新增功能
iMazing 2.16.6这是一款非常方便的 iPhone 管理工具,尤其是在升级、降级、越狱之前,做好备份是必不可少的一步,千万别偷懒。有一款用着顺手的iOS管理工具在手边,让数字生活更安心!
216 0
超好用iOS管软件iMazing 2.16.6官网下载及2023新增功能
|
JSON 缓存 API
iOS中的一些小功能和技巧
iOS中的一些小功能和技巧
423 0
iOS中的一些小功能和技巧
|
存储 编解码 缓存
ios设备管理软件iMazing2.16.2 官网2022最新版免费下载以及新增功能
iMazing是一款iOS设备管理软件,该软件支持对基于iOS系统的设备进行数据传输与备份,用户可以将包括:照片、音乐、铃声、视频、电子书及通讯录等在内的众多信息在Windows/Mac电脑中传输/备份/管理。 iMazing是一款第三方的苹果iOS设备管理软件。大家将iPhone、iPad或iPod连接到电脑后,可以用它进行音乐传输、照片传输、数据备份等操作。
214 0
ios设备管理软件iMazing2.16.2 官网2022最新版免费下载以及新增功能