給iOS開發新手送點福利,簡述UIImagePickerController的屬性和用法

徐明清發表於2014-09-16

1.+(BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType;         // 檢查指定源是否在裝置上可用。

[UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary];   //檢查照片源是否可用

 

2.allowsEditing 預設NO

是否允許編輯

[imagePicker setAllowsEditing:YES];  // 允許編輯

 

3. videoMaximumDuration

設定UIImagePicker的最大視訊持續時間.預設10分鐘

 

4. + availableMediaTypesForSourceType: // 指定源可用的媒體種類

// 獲得相機模式下支援的媒體型別

NSArray* availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

 

5. sourceType

設定UIImagePicker照片源型別,預設有3種。

UIImagePickerControllerSourceTypeCamera                 照相機

UIImagePickerControllerSourceTypePhotoLibrary          照片庫(通過同步存放的,使用者不能刪除)

UIImagePickerControllerSourceTypeSavedPhotosAlbum    儲存的照片(通過拍照或者截圖儲存的,使用者可以刪除)

 

6.UIImagePicker使用步驟:

檢查指定源是否可用. isSourceTypeAvailable:方法.
檢查可用媒體(視訊還是隻能是圖片) availableMediaTypesForSourceType:方法.
設定介面媒體屬性mediaTypes property.
顯示介面使用presentViewController:animated:completion:方法.iPad中是popover形式.需要確保sourceType有效.
相關操作,移除檢視.

如果想建立一個完全自定義介面的image picker來瀏覽圖片,使用 Assets Library Framework Reference中的類. (AV Foundation Programming Guide 中的 “Media Capture and Access to Camera” )

 

7.設定源

+ availableMediaTypesForSourceType: // 指定源可用的媒體種類
+ isSourceTypeAvailable: // 指定源是否在裝置上可用
sourceType

// 執行相關介面前需要指明源型別.必須有效,否則丟擲異常. picker已經顯示的時候改變這個值,picker會相應改變來適應.

預設 UIImagePickerControllerSourceTypePhotoLibrary.


8.設定picker屬性

allowsEditing //是否可編輯
delegate
mediaTypes

// 指示picker中顯示的媒體型別.設定每種型別之前應用availableMediaTypesForSourceType:檢查一下.如果為空或者array中型別都不可用,會發生異常.

預設 kUTTypeImage, 只能顯示圖片.

    

9.video選取引數

videoQuality //視訊拍攝選取時的編碼質量.只有mediaTypes包含kUTTypeMovie時有效.
videoMaximumDuration //秒,video最大記錄時間,預設10分鐘.只用當mediaTypes包含kUTTypeMovie時有效.


10.自定義介面

 showsCameraControls 
// 指示 picker 是否顯示預設的camera controls.預設是YES,設定成NO隱藏預設的controls來使用自定義的overlay view.(從而可以實現多選而不是選一張picker就dismiss了).只有 UIImagePickerControllerSourceTypeCamera源有效,否則NSInvalidArgumentException異常.

cameraOverlayView
//自定義的用於顯示在picker之上的view.只有當源是UIImagePickerControllerSourceTypeCamera時有效.其他時候使用丟擲NSInvalidArgumentException異常.

cameraViewTransform
//預先動畫.隻影響預先影象,對自定義的overlay view和預設的picker無效.只用當picker的源是UIImagePickerControllerSourceTypeCamera時有效,否則NSInvalidArgumentException異常.


11.選取媒體

 – takePicture 
//使用攝像頭選取一個圖片。自定義overlay可以多選。已經有圖片正在選取是呼叫無效,必須要等delegate收到 imagePickerController:didFinishPickingMediaWithInfo:訊息後才能再次選取。非UIImagePickerControllerSourceTypeCamera源會導致異常。

– startVideoCapture
– stopVideoCapture
//結束視訊選取,之後系統呼叫delegate的 imagePickerController:didFinishPickingMediaWithInfo:方法。


12.設定攝像頭

cameraDevice //使用的鏡頭(預設後置的)
+ isCameraDeviceAvailable: // 攝像裝置是否可用.
+ availableCaptureModesForCameraDevice: // 裝置可用的選取模式
cameraCaptureMode //相機捕獲模式
cameraFlashMode //閃光燈模式(預設自動)
+ isFlashAvailableForCameraDevice: // 是否有閃光能力


13.UIImagePickerControllerDelegate

使用UIImageWriteToSavedPhotosAlbum儲存影象, UISaveVideoAtPathToSavedPhotosAlbum儲存視訊. 4.0後使用writeImageToSavedPhotosAlbum:metadata:completionBlock:儲存後設資料.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

//包含選擇的圖片或者一個視訊的URL,詳見“Editing Information Keys.”
//如果是設定可編輯屬性,那麼picker會預顯示選中的媒體,編輯後的與初始的都會儲存在info中.

– imagePickerControllerDidCancel:
– imagePickerController:didFinishPickingImage:editingInfo://Deprecated in iOS 3.0

NSString *const UIImagePickerControllerMediaType;// 媒體型別
NSString *const UIImagePickerControllerOriginalImage;// 原始未編輯的影象
NSString *const UIImagePickerControllerEditedImage;// 編輯後的影象
NSString *const UIImagePickerControllerCropRect;// 源影象可編輯(有效?)區域
NSString *const UIImagePickerControllerMediaURL;// 視訊的路徑
NSString *const UIImagePickerControllerReferenceURL;// 原始選擇項的URL
NSString *const UIImagePickerControllerMediaMetadata;// 只有在使用攝像頭並且是影象型別的時候有效.包含選擇影象資訊的字典型別

14. UIImagePickerController小例子

UIImagePickerController的代理需要遵守這兩個協議.<UIImagePickerControllerDelegate, UINavigationControllerDelegate>

#pragma mark 選擇照片

- (void)selectPhoto

{

    // 1. 首先判斷照片源是否可用

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {

        // 0)例項化控制器

        UIImagePickerController *picker = [[UIImagePickerController alloc]init];

        // 1)設定照片源

        [picker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];

        // 2) 設定允許修改

        [picker setAllowsEditing:YES];

        // 3) 設定代理

        [picker setDelegate:self];

        // 4) 顯示控制器

        [self presentViewController:picker animated:YES completion:nil];

    } else {

        NSLog(@"照片源不可用");

    }

}

#pragma mark - imagePicker代理方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

{

      UIImage *image = info[@"UIImagePickerControllerEditedImage"];

      [_imageButton setImage:image forState:UIControlStateNormal];

      // 關閉照片選擇器

      [self dismissViewControllerAnimated:YES completion:nil];

 

      // 需要將照片儲存至應用程式沙箱,由於涉及到資料儲存,同時與介面無關

      // 可以使用多執行緒來儲存影象

      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      // 儲存影象

     // 1. 取影象路徑

     NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

     NSString *imagePath = [docs[0]stringByAppendingPathComponent:@"abc.png"];

       // 2. 轉換成NSData儲存

       NSData *imageData = UIImagePNGRepresentation(image);

       [imageData writeToFile:imagePath atomically:YES];

    });

}

 

相關文章