打開攝像頭拍照更換圖片, 并保存到沙盒及本地相冊(cè), 還有直接從圖庫選擇圖片以及一系列的權(quán)限判斷與跳轉(zhuǎn)

在vc中
先引入一個(gè)頭文件, 用于ios9下判斷是否有訪問系統(tǒng)相冊(cè)權(quán)限

#import <Photos/Photos.h>

先簽這倆協(xié)議

@interface NAMinePicModifyViewController ()< UIImagePickerControllerDelegate, UINavigationControllerDelegate>

寫個(gè)屬性

@property (nonatomic, strong) UIImagePickerController *imagePickerController;

寫個(gè)懶加載, 避免重復(fù)創(chuàng)建

- (UIImagePickerController *)imagePickerController{
    if (!_imagePickerController) {
    _imagePickerController = [[UIImagePickerController alloc] init];
    _imagePickerController.delegate = self;
    
    //模態(tài)推出照相機(jī)頁面的樣式
    _imagePickerController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    _imagePickerController.allowsEditing = YES;
    }
return _imagePickerController;
}

在一個(gè)拍照觸發(fā)按鈕點(diǎn)擊事件, cell點(diǎn)擊事件也行,

#pragma mark - 選擇拍照
- (void)selectImageFromCamera{

    //判斷相機(jī)是否可用
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
    
    //判斷是否開啟相機(jī)權(quán)限
    AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    
    //權(quán)限未開啟
    if (authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied)
    {
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"抱歉" message:@"您尚未開啟相機(jī)權(quán)限" preferredStyle:UIAlertControllerStyleAlert];
        
        UIAlertAction *actionOK = [UIAlertAction actionWithTitle:@"去開啟" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            
             NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
            
            //info plist中URL type中添加一個(gè)URL Schemes添加一個(gè)prefs值
            if([[UIApplication sharedApplication] canOpenURL:url]){
                
                //跳轉(zhuǎn)到隱私
                 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=Privacy&path=CAMERA"]];
                
            }
        }];
        
        UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"不了" style:UIAlertActionStyleDefault handler:nil];
        
        [alertController addAction:actionOK];
        [alertController addAction:actionCancel];
        
        
        [self presentViewController:alertController animated:YES completion:nil];

    }
    
    //權(quán)限已開啟
    else{

        self.imagePickerController.delegate = self;
        self.imagePickerController.allowsEditing = YES;
        self.imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
        [self presentViewController:self.imagePickerController animated:YES completion:^{}];
    }
}
//適用于沒有相機(jī)的設(shè)備
else{

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"抱歉" message:@"相機(jī)不可用" preferredStyle:UIAlertControllerStyleAlert];
    [self presentViewController:alertController animated:YES completion:nil];

    #pragma mark - 讓alert自動(dòng)消失
     [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(creatAlert:) userInfo:alertController repeats:NO];

    }

}

#pragma mark - 讓警告消失
- (void)creatAlert:(NSTimer *)timer{

    UIAlertController *alert = [timer userInfo];
    [alert dismissViewControllerAnimated:YES completion:nil];
    alert = nil;

}


#pragma mark - ImagePicker delegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{

    [picker dismissViewControllerAnimated:YES completion:^{
    
    
    }];

    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    /* 此處info 有六個(gè)值
     * UIImagePickerControllerMediaType; // an NSString UTTypeImage)
     * UIImagePickerControllerOriginalImage;  // a UIImage 原始圖片
     * UIImagePickerControllerEditedImage;    // a UIImage 裁剪后圖片
     * UIImagePickerControllerCropRect;       // an NSValue (CGRect)
     * UIImagePickerControllerMediaURL;       // an NSURL
     * UIImagePickerControllerReferenceURL    // an NSURL that references an asset in the AssetsLibrary framework
     * UIImagePickerControllerMediaMetadata    // an NSDictionary containing metadata from a captured photo
     */
    //保存圖片至本地
    [self saveImage:image withName:@"currentImage.png"];

    NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"currentImage.png"];
    UIImage *savedImage = [[UIImage alloc] initWithContentsOfFile:fullPath];

//這個(gè)本來是想用于拍照后編輯的, 發(fā)現(xiàn)并沒有用
    //self.isFullScreen = NO;

    //用拍下來的照片賦值
    [_headerView.buttonOfIcon setImage:savedImage forState:UIControlStateNormal];


    //訪問相冊(cè)權(quán)限, ios9之后的api, 要引入<Photos/Photos.h>
    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];

    //相冊(cè)權(quán)限已開啟
    if(status == PHAuthorizationStatusAuthorized){
    
        //存入本地相冊(cè)
        UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    
}

//未開啟相冊(cè)權(quán)限
//PHAuthorizationStatusNotDetermined,
//PHAuthorizationStatusRestricted
//PHAuthorizationStatusDenied
    else{

        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"您尚未開啟相冊(cè)權(quán)限" message:@"無法存入所拍的照片" preferredStyle:UIAlertControllerStyleAlert];
    
        UIAlertAction *actionOK = [UIAlertAction actionWithTitle:@"去開啟" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        
        NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        
        //info plist中URL type中添加一個(gè)URL Schemes添加一個(gè)prefs值
        if([[UIApplication sharedApplication] canOpenURL:url]){
            
            //跳轉(zhuǎn)到隱私
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=Privacy&path=PHOTOS"]];
            
        }
    }];
    
    UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"不了" style:UIAlertActionStyleDefault handler:nil];
    
    [alertController addAction:actionOK];
    [alertController addAction:actionCancel];
    
    
    [self presentViewController:alertController animated:YES completion:nil];

}

}

#pragma mark - 存儲(chǔ)到系統(tǒng)相冊(cè)結(jié)果回調(diào)
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo
{

    if (error)
    {
        NSLog(@"%@", error);
    
    }
    else
    {
        NSLog(@"保存成功");
    }

}

#pragma mark - 保存圖片至沙盒
- (void)saveImage:(UIImage *)currentImage withName:(NSString *)imageName{

    if (UIImagePNGRepresentation(currentImage)) {
    
   data = UIImagePNGRepresentation(currentImage);
    
}else{
    
   data = UIImageJPEGRepresentation(currentImage, 1.0);
    
}

    //獲取沙盒目錄
    NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:imageName];

    //將圖片寫入文件
    //atomically:這個(gè)參數(shù)意思是如果為YES則保證文件的寫入原子性,就是說會(huì)先創(chuàng)建一個(gè)臨時(shí)文件,直到文件內(nèi)容寫入成功再導(dǎo)入到目標(biāo)文件里.如果為NO,則直接寫入目標(biāo)文件里
    [data writeToFile:fullPath atomically:NO];

}

在視圖類中, 對(duì)每次程序啟動(dòng)進(jìn)行判斷

#pragma mark - 確保每次運(yùn)行都是上次修改后的照片
//讀取圖片
NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"currentImage.png"];
UIImage *savedImage = [[UIImage alloc] initWithContentsOfFile:fullPath];

//本地有的話直接讀取沙盒本地
if (savedImage) {
    [_buttonOfIcon setImage:savedImage forState:UIControlStateNormal];
}
//沒有的話是默認(rèn)初始圖片
else{
    [_buttonOfIcon setImage:[UIImage imageNamed:@"sendPhoto"] forState:UIControlStateNormal];
}

調(diào)用系統(tǒng)相冊(cè)、相機(jī)發(fā)現(xiàn)是英文的系統(tǒng)相簿界面后標(biāo)題顯示“photos”最疆,但是手機(jī)語言已經(jīng)設(shè)置顯示中文,糾結(jié)半天服爷,最終在info.plist設(shè)置解決問題

info.plist里面添加Localized resources can be mixed YES

表示是否允許應(yīng)用程序獲取框架庫內(nèi)語言。

最后 感謝http://my.oschina.net/joanfen/blog/134677

--------------------我是分割線----------------------------------
此處感謝http://www.xuanyusong.com/archives/1493
接下來說打開本地相冊(cè)選取圖片

pragma mark - 選擇打開本地圖庫

- (void)openLocalAlbum{

self.imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
self.imagePickerController.delegate = self;
//設(shè)置選擇后的圖片可被編輯
self.imagePickerController.allowsEditing = YES;
[self presentViewController:self.imagePickerController animated:YES completion:^{}];

}

再配合之前寫的

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info

方法即可, 如果已經(jīng)寫了, 則不用再寫一遍, 也不用分開判斷

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末园爷,一起剝皮案震驚了整個(gè)濱河市琳钉,隨后出現(xiàn)的幾起案子戳表,更是在濱河造成了極大的恐慌,老刑警劉巖镣屹,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件价涝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡伪窖,警方通過查閱死者的電腦和手機(jī)居兆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門泥栖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來簇宽,“玉大人吧享,你說我怎么就攤上這事钢颂。” “怎么了甸陌?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵钱豁,是天一觀的道長疯汁。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么溃卡? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任蜒简,我火速辦了婚禮,結(jié)果婚禮上犹赖,老公的妹妹穿的比我還像新娘卷仑。我一直安慰自己,他們只是感情好锡凝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布窜锯。 她就那樣靜靜地躺著,像睡著了一般衬浑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尸饺,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天助币,我揣著相機(jī)與錄音,去河邊找鬼迹栓。 笑死俭缓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的华坦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼犁跪,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了寝优?” 一聲冷哼從身側(cè)響起枫耳,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妻熊,沒想到半個(gè)月后仑最,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亿胸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年预皇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片序仙。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲁豪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爬橡,到底是詐尸還是另有隱情,我是刑警寧澤宾添,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布柜裸,位于F島的核電站,受9級(jí)特大地震影響榄檬,放射性物質(zhì)發(fā)生泄漏衔统。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一舱殿、第九天 我趴在偏房一處隱蔽的房頂上張望险掀。 院中可真熱鬧,春花似錦樟氢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至潦牛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朴爬,已是汗流浹背橡淆。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚣常,地道東北人痊银。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像溯革,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冈闭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,769評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫萎攒、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,064評(píng)論 4 62
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理刃永,服務(wù)發(fā)現(xiàn)羊精,斷路器,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 今天的讀書會(huì)主題是:從弗洛伊德這杯酒中品人格心理學(xué)读规。一個(gè)小時(shí)的學(xué)習(xí)與分享在愉快的閱讀體驗(yàn)中不知不覺地結(jié)束了燃少。深?yuàn)W的...
    筱箖2017閱讀 237評(píng)論 0 0
  • 在上一篇文章中,Jason老師提到名詞從句在句子中可以做主語供汛、賓語和補(bǔ)語。 今天雀久,Jason老師繼續(xù)帶大家了解名詞...
    JasonEnglish閱讀 565評(píng)論 0 0