[iOS Dev] 使用 UIImagePickerController 取得相簿照片

2015-12-17

內建的取得相簿功能 已經可以滿足一般只是要拿照片的需求

▼ 首先在 .h 檔案中加入 delegate
以及詢問相簿權限的 Photos library ( iOS9 以上)

#import 
@import Photos;
@interface ViewController : UIViewController 
@end

▼ 開啟相簿功能

//建立一個ImagePickerController
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

// 設定影像來源 這裡設定為相簿
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

// 設置 delegate
imagePicker.delegate = self;

// 設定選完照片後可以編輯
imagePicker.allowsEditing = YES;
    
// 顯示相簿
[self presentViewController:imagePicker animated:YES completion:nil];

上面顯示相簿後 就會進入內建的相簿介面
接著選完照片後 如果 allowsEditing = YES 有設定
還會有一個編輯的步驟
▼ 完成後會帶著圖片返回 使用下面這個 delegate method

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    
    // 取得編輯後的圖片 UIImage
    UIImage *img = [info objectForKey:UIImagePickerControllerEditedImage];
    if (img == nil) {
        // 如果沒有編輯 則是取得原始拍照的照片 UIImage
        img = [info objectForKey:UIImagePickerControllerOriginalImage];
    }
    
    // 再來就是對圖片的處理 img 是一個 UIImage
    imgView.image = img;
    
    //移除Picker
    [picker dismissViewControllerAnimated:YES completion:nil];
}

▼ iOS 9 之後 詢問相簿權限改成使用 PHPhotoLibrary

PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if ( status == PHAuthorizationStatusNotDetermined ) {
    // 尚未詢問使用者權限
} else if ( status == PHAuthorizationStatusRestricted ) {
    // restricted, 通常不會發生
} else if ( status == PHAuthorizationStatusDenied ) {
    // 使用者拒絕提供權限
} else if ( status == PHAuthorizationStatusAuthorized ) {
    // 已取得使用者權限
}

不過因為如果沒有取得權限
進到原先要顯示相簿列表的地方
會改成顯示 “提示使用者到 設定>隱私權 打開權限” 的字樣
所以我作的話是偷懶沒有設置確認權限XD

▼ 以上都設定完後 相簿介面應該是預設的英文
如果相簿介面要設定多國語系 需要對 info.plist 作多國語系的處理
詳細可參考 Localize info.plist 多國語系 InfoPlist.strings

我製作了一個 相簿 demo app 放在 github

ref:
https://developer.apple.com/library/ios/documentation/Photos/Reference/PHPhotoLibrary_Class