iOS開發(fā)-幾行代碼快速調(diào)用照相機(jī)和相冊(cè)鸣个,并實(shí)現(xiàn)沙盒中照片的保存與讀刃叻础(基于UIImagePickerController的封裝)

現(xiàn)在大部分的APP開發(fā)時(shí)都會(huì)調(diào)用系統(tǒng)的照相機(jī)和相冊(cè),并且系統(tǒng)提供UIImagePickerController這個(gè)類供我們開發(fā)使用囤萤,筆者在此之上進(jìn)行了簡(jiǎn)單的封裝(SZKImagePickerVC)昼窗,使調(diào)用更加方便,快捷涛舍,并且實(shí)現(xiàn)了在沙盒中保存與讀取照片澄惊。如有不足之處,還望各位讀者能夠批評(píng)指正,筆者定會(huì)虛心改正掸驱。

效果圖:

A68D29B5-D854-46C6-99B0-D11DBF3D30D0.png

調(diào)用方法:
在ViewController.m中調(diào)用 創(chuàng)建圓形按鈕

- (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應(yīng)當(dāng)與保存時(shí)的name相同
    UIImage *sandBoxImage=[SZKImagePickerVC loadImageFromSandbox:@"image"];
    [_titleBt setBackgroundImage:sandBoxImage forState:UIControlStateNormal];
}

點(diǎn)擊按鈕彈出UIActionSheet選擇框

#pragma mark----跳轉(zhuǎn)到SZKImagePickerVC中
-(void)titleBtClick
{
    //判斷是否支持相機(jī)  模擬器去除相機(jī)功能
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
        UIActionSheet *sheet=[[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"打開照相機(jī)",@"從相冊(cè)上傳" ,nil];
        [sheet showInView:self.view];
    }else{
        UIActionSheet *sheet=[[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"從相冊(cè)上傳" ,nil];
        [sheet showInView:self.view];
    }
}

實(shí)現(xiàn)UIActionSheetDelegate跳轉(zhuǎn)到SZKImagePickerVC

#pragma mark-----UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    //判斷是否支持相機(jī)
    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----跳轉(zhuǎn)到SZKImagePickerVC
-(void)presentViewController:(imagePickerStyle)style
{
    SZKImagePickerVC *picker=[[SZKImagePickerVC alloc]initWithImagePickerStyle:style];
    picker.SZKDelegate=self;
    [self presentViewController:picker animated:YES completion:nil];
}

實(shí)現(xiàn)SZKImagePickerVCDelegate代理方法 將選中之后的照片返回肛搬,并調(diào)用類方法將圖片保存到沙盒

#pragma mark----SZKImagePickerVCDelegate
-(void)imageChooseFinish:(UIImage *)image
{
    [_titleBt setBackgroundImage:image forState:UIControlStateNormal];
    //保存到沙盒中
    [SZKImagePickerVC saveImageToSandbox:image andImageNage:@"image" andResultBlock:^(BOOL success) {
        NSLog(@"保存成功");
    }];
}

以上就是大致的調(diào)用過程,點(diǎn)擊按鈕彈出選擇框毕贼,選擇照相機(jī)或者相冊(cè)温赔,但是模擬器不支持相機(jī),就去掉了相機(jī)功能鬼癣,真機(jī)上筆者親測(cè)可以正常使用陶贼,再實(shí)現(xiàn)SZKImagePickerVCDelegate方法便可以獲取到選中之后的image。

下面介紹一下實(shí)現(xiàn)的方法:
SZKImagePickerVC.h中
SZKImagePickerVC是繼承于UIImagePickerController待秃,可以調(diào)用父類的方法拜秧。

提供一個(gè)枚舉用來判斷是調(diào)用照相機(jī)還是相冊(cè)

typedef  NS_ENUM(NSUInteger,imagePickerStyle){
    ImagePickerStyleCamera,
    ImagePickerStylePhotoLibrary
};

SZKImagePickerVCDelegate的代理方法

@protocol SZKImagePickerVCDelegate <NSObject>

-(void)imageChooseFinish:(UIImage *)image;

@end

封裝相應(yīng)的接口

/**
 *  保存成功回調(diào)
 *
 *  @param success 保存成功的block
 */
typedef void(^resultBlock)(BOOL success);


@interface SZKImagePickerVC : UIImagePickerController
/**
 *  SZKImagePickerVCDelegate
 */
@property(nonatomic,assign)id<SZKImagePickerVCDelegate>SZKDelegate;

/**
 *  初始化SZKImagePicker
 *
 *  @param style 打開照相機(jī)或者圖庫
 *
 *  @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;
/**
 *  根據(jù)文件獲取沙盒路徑
 *
 *  @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;
}

系統(tǒng)的代理方法,選中照片后將照片傳入self.SZKDelegate中锥余,供外部調(diào)用

#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];
}

將照片保存到沙盒的實(shí)現(xiàn)方法腹纳,填入imageName

#pragma mark----將照片保存到沙盒
+(void)saveImageToSandbox:(UIImage *)image andImageNage:(NSString *)imageName andResultBlock:(resultBlock)block
{
    //高保真壓縮圖片,此方法可將圖片壓縮驱犹,但是圖片質(zhì)量基本不變嘲恍,第二個(gè)參數(shù)為質(zhì)量參數(shù)
    NSData *imageData=UIImageJPEGRepresentation(image, 0.5);
    //將圖片寫入文件
   NSString *filePath=[self filePath:imageName];
   //是否保存成功
    BOOL result=[imageData writeToFile:filePath atomically:YES];
    //保存成功傳值到blcok中
    if (result) {
        block(result);
    }
}

根據(jù)imageName從沙盒中取出照片,圖片的名稱應(yīng)當(dāng)與保存時(shí)候的名稱相同

#pragma mark----從沙盒中讀取照片
+(UIImage *)loadImageFromSandbox:(NSString *)imageName
{
    //獲取沙盒路徑
    NSString *filePath=[self filePath:imageName];
    //根據(jù)路徑讀取image
    UIImage *image=[UIImage imageWithContentsOfFile:filePath];
    
    return image;
}

根據(jù)文件名稱獲取沙盒路徑

#pragma mark----獲取沙盒路徑
+(NSString *)filePath:(NSString *)fileName
{
    //獲取沙盒目錄
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //保存文件名稱
    NSString *filePath=[paths[0] stringByAppendingPathComponent:fileName];
    
    return filePath;
}

大致的實(shí)現(xiàn)方法就是這樣,如果有不足或者錯(cuò)誤的地方還望各位讀者批評(píng)指正雄驹,可以評(píng)論留言佃牛,筆者收到后第一時(shí)間回復(fù),也可以添加筆者的QQ/微信:790057066 医舆,并且已經(jīng)把demo上傳到了GitHub上面感興趣的朋友俘侠,可以上去下載查看,記得star下蔬将,非常感謝爷速。

SZKImagePickerVCdemo鏈接:https://github.com/18811314750/SZKImagePickerVC

筆者的其他文章:
iOS開發(fā)-利用命令行實(shí)現(xiàn)將本地代碼上傳到GitHub
http://www.reibang.com/p/79b94add9057

iOS在線音樂播放SZKAVPlayer(基于AVPlayer的封裝)
http://www.reibang.com/p/4e0ac2898de0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市霞怀,隨后出現(xiàn)的幾起案子惫东,更是在濱河造成了極大的恐慌,老刑警劉巖毙石,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廉沮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡徐矩,警方通過查閱死者的電腦和手機(jī)滞时,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滤灯,“玉大人坪稽,你說我怎么就攤上這事曼玩。” “怎么了刽漂?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵演训,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我贝咙,道長(zhǎng)样悟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任庭猩,我火速辦了婚禮窟她,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔼水。我一直安慰自己震糖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布趴腋。 她就那樣靜靜地躺著吊说,像睡著了一般。 火紅的嫁衣襯著肌膚如雪优炬。 梳的紋絲不亂的頭發(fā)上颁井,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蠢护,去河邊找鬼雅宾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛葵硕,可吹牛的內(nèi)容都是我干的眉抬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼懈凹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜀变!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起介评,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤昏苏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后威沫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洼专,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年棒掠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屁商。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烟很,死狀恐怖颈墅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雾袱,我是刑警寧澤恤筛,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站芹橡,受9級(jí)特大地震影響毒坛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜林说,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一煎殷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腿箩,春花似錦豪直、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钧惧,卻和暖如春暇韧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垢乙。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工锨咙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人追逮。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓酪刀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親钮孵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骂倘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件巴席、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • 時(shí)間漾唉,它是無情的整容師 ——題記 那在車站前的錯(cuò)愕相見荧库。 那在拐角處的不經(jīng)意一瞥。 那在多年聚會(huì)時(shí)的相見相...
    臨淵ii閱讀 226評(píng)論 0 0
  • 這個(gè)世界上人來人往赵刑,來去匆匆分衫,為事業(yè),為家庭般此,為理想蚪战,疲于拼命牵现,力赴前方。有少數(shù)人邀桑,或許家庭蔭蔽瞎疼,或是人中龍鳳,早...
    介甲閱讀 587評(píng)論 0 0
  • 我從一個(gè)破舊的宅門前經(jīng)過 被依坐在門前的老嫗盯著 我匆匆走過 聽見她哀怨的嘆息著 忍不住回首遙望 她眼底的...
    陳小沫閱讀 261評(píng)論 0 0