現在大部分的APP開發時都會調用系統的照相機和相冊,并且系統提供UIImagePickerController這個類供我們開發使用,筆者在此之上進行了簡單的封裝(SZKImagePickerVC),使調用更加方便,快捷,并且實現了在沙盒中保存與讀取照片。如有不足之處,還望各位讀者能夠批評指正,筆者定會虛心改正。
效果圖:
調用方法:
在ViewController.m中調用 創建圓形按鈕
- (void)viewDidLoad {
[super viewDidLoad];
_titleBt=[[UIButton alloc]initWithFrame:CGRectMake(WIDTH/2-75, 150, 150, 150)];
_titleBt.backgroundColor=[UIColor yellowColor];
_titleBt.layer.cornerRadius=75;
_titleBt.layer.masksToBounds=YES;
[_titleBt addTarget:self action:@selector(titleBtClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_titleBt];
//從沙盒中讀取照片 imageName應當與保存時的name相同
UIImage *sandBoxImage=[SZKImagePickerVC loadImageFromSandbox:@"image"];
[_titleBt setBackgroundImage:sandBoxImage forState:UIControlStateNormal];
}
點擊按鈕彈出UIActionSheet選擇框
#pragma mark----跳轉到SZKImagePickerVC中
-(void)titleBtClick
{
//判斷是否支持相機 模擬器去除相機功能
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
UIActionSheet *sheet=[[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"打開照相機",@"從相冊上傳" ,nil];
[sheet showInView:self.view];
}else{
UIActionSheet *sheet=[[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"從相冊上傳" ,nil];
[sheet showInView:self.view];
}
}
實現UIActionSheetDelegate跳轉到SZKImagePickerVC
#pragma mark-----UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
//判斷是否支持相機
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
switch (buttonIndex) {
case 0:{
[self presentViewController:ImagePickerStyleCamera];
}
break;
case 1:{
[self presentViewController:ImagePickerStylePhotoLibrary];
}
break;
default:
break;
}
}else{
switch (buttonIndex) {
case 0:{
[self presentViewController:ImagePickerStylePhotoLibrary];
}
break;
default:
break;
}
}
}
#pragma mark----跳轉到SZKImagePickerVC
-(void)presentViewController:(imagePickerStyle)style
{
SZKImagePickerVC *picker=[[SZKImagePickerVC alloc]initWithImagePickerStyle:style];
picker.SZKDelegate=self;
[self presentViewController:picker animated:YES completion:nil];
}
實現SZKImagePickerVCDelegate代理方法 將選中之后的照片返回,并調用類方法將圖片保存到沙盒
#pragma mark----SZKImagePickerVCDelegate
-(void)imageChooseFinish:(UIImage *)image
{
[_titleBt setBackgroundImage:image forState:UIControlStateNormal];
//保存到沙盒中
[SZKImagePickerVC saveImageToSandbox:image andImageNage:@"image" andResultBlock:^(BOOL success) {
NSLog(@"保存成功");
}];
}
以上就是大致的調用過程,點擊按鈕彈出選擇框,選擇照相機或者相冊,但是模擬器不支持相機,就去掉了相機功能,真機上筆者親測可以正常使用,再實現SZKImagePickerVCDelegate方法便可以獲取到選中之后的image。
下面介紹一下實現的方法:
SZKImagePickerVC.h中
SZKImagePickerVC是繼承于UIImagePickerController,可以調用父類的方法。
提供一個枚舉用來判斷是調用照相機還是相冊
typedef NS_ENUM(NSUInteger,imagePickerStyle){
ImagePickerStyleCamera,
ImagePickerStylePhotoLibrary
};
SZKImagePickerVCDelegate的代理方法
@protocol SZKImagePickerVCDelegate <NSObject>
-(void)imageChooseFinish:(UIImage *)image;
@end
封裝相應的接口
/**
* 保存成功回調
*
* @param success 保存成功的block
*/
typedef void(^resultBlock)(BOOL success);
@interface SZKImagePickerVC : UIImagePickerController
/**
* SZKImagePickerVCDelegate
*/
@property(nonatomic,assign)id<SZKImagePickerVCDelegate>SZKDelegate;
/**
* 初始化SZKImagePicker
*
* @param style 打開照相機或者圖庫
*
* @return 初始化SZKImagePicker
*/
-(instancetype)initWithImagePickerStyle:(imagePickerStyle)style;
/**
* 保存圖片到沙盒
*
* @param image 要保存的圖片
* @param imageName 保存的圖片名稱
* @param block 保存成功的值
*/
+(void)saveImageToSandbox:(UIImage *)image
andImageNage:(NSString *)imageName
andResultBlock:(resultBlock)block;
/**
* 沙盒中獲取到的照片
*
* @param imageName 讀取的照片名稱
*
* @return 從沙盒讀取到的照片
*/
+(UIImage *)loadImageFromSandbox:(NSString *)imageName;
/**
* 根據文件獲取沙盒路徑
*
* @param fileName 文件名稱
*
* @return 文件在沙盒中的路徑
*/
+(NSString *)filePath:(NSString *)fileName;
SZKImagePickerVC.m中
初始化SZKImagePickerVC
-(instancetype)initWithImagePickerStyle:(imagePickerStyle)style
{
self=[super init];
if (self) {
if (style==ImagePickerStyleCamera) {
self.sourceType=UIImagePickerControllerSourceTypeCamera;
}else if(style==ImagePickerStylePhotoLibrary){
self.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;
}
}
return self;
}
系統的代理方法,選中照片后將照片傳入self.SZKDelegate中,供外部調用
#pragma mark---選取照片
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
//界面返回
[picker dismissViewControllerAnimated:YES completion:nil];
//獲取編輯之后的圖片
UIImage *editedImage=[info objectForKey:UIImagePickerControllerEditedImage];
//將獲取的image傳入代理方法中
[self.SZKDelegate imageChooseFinish:editedImage];
}
將照片保存到沙盒的實現方法,填入imageName
#pragma mark----將照片保存到沙盒
+(void)saveImageToSandbox:(UIImage *)image andImageNage:(NSString *)imageName andResultBlock:(resultBlock)block
{
//高保真壓縮圖片,此方法可將圖片壓縮,但是圖片質量基本不變,第二個參數為質量參數
NSData *imageData=UIImageJPEGRepresentation(image, 0.5);
//將圖片寫入文件
NSString *filePath=[self filePath:imageName];
//是否保存成功
BOOL result=[imageData writeToFile:filePath atomically:YES];
//保存成功傳值到blcok中
if (result) {
block(result);
}
}
根據imageName從沙盒中取出照片,圖片的名稱應當與保存時候的名稱相同
#pragma mark----從沙盒中讀取照片
+(UIImage *)loadImageFromSandbox:(NSString *)imageName
{
//獲取沙盒路徑
NSString *filePath=[self filePath:imageName];
//根據路徑讀取image
UIImage *image=[UIImage imageWithContentsOfFile:filePath];
return image;
}
根據文件名稱獲取沙盒路徑
#pragma mark----獲取沙盒路徑
+(NSString *)filePath:(NSString *)fileName
{
//獲取沙盒目錄
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//保存文件名稱
NSString *filePath=[paths[0] stringByAppendingPathComponent:fileName];
return filePath;
}
大致的實現方法就是這樣,如果有不足或者錯誤的地方還望各位讀者批評指正,可以評論留言,筆者收到后第一時間回復,也可以添加筆者的QQ/微信:790057066 ,并且已經把demo上傳到了GitHub上面感興趣的朋友,可以上去下載查看,記得star下,非常感謝。
SZKImagePickerVCdemo鏈接:https://github.com/18811314750/SZKImagePickerVC
筆者的其他文章:
iOS開發-利用命令行實現將本地代碼上傳到GitHub
http://www.lxweimin.com/p/79b94add9057
iOS在線音樂播放SZKAVPlayer(基于AVPlayer的封裝)
http://www.lxweimin.com/p/4e0ac2898de0