IOS有兩種拍照與拍攝視頻的方式
1. 直接使用UIImagePickerController, 這可以提供一個簡單便捷的拍照與選擇圖庫里圖片的功能.
2.另一種方式就是通過AV Foundation framework,來完全自定義拍照的界面與選擇圖庫的界面.
這里介紹第一種, 如何使用UIImagePickerController.
一.拍照
步驟
1. 定義UIImagePickerController, 啟動拍照界面
(1)首先攝像頭對於你的應用是必須的,那你應該在項目的Info.plist的Required device capabilities里添加自己要的設備.這里有相關的設備描述.
(2) 要確保你的設備可用,所以在代碼中最好先用UIImagePickerController的isSourceTypeAvailable:方面來判斷一下,否則如果直接寫邏輯,那在設備不可用時,程序會拋異常.
(3) 在拍攝完后,想要能夠關掉拍攝界面,那就必須要實現UIImagePickerControllerDelegate
UIImagePickerController 里有幾個比較重要的屬性.
Source type: 這個參數是用來確定是調用攝像頭還是調用圖片庫.如果是 UIImagePickerControllerSourceTypeCamera 就是調用攝像頭,如果是UIImagePickerControllerSourceTypePhotoLibrary 就是調用圖片庫,如果是UIImagePickerControllerSourceTypeSavedPhotosAlbum 則調用iOS設備中的膠卷相機的圖片.
Media types:在拍照時,用來指定是拍靜態的圖片還是錄像.kUTTypeImage
表示靜態圖片, kUTTypeMovie表示錄像.
Editing controls :用來指定是否可編輯.將allowsEditing
屬性設置為YES表示可編輯,NO表示不可編輯.
示例代碼:(來源於apple官方文檔)
- (BOOL) startCameraControllerFromViewController: (UIViewController*) controller usingDelegate: (id <UIImagePickerControllerDelegate, UINavigationControllerDelegate>) delegate { // here, check the device is available or not if (([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera] == NO) || (delegate == nil)|| (controller == nil)) return NO; UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; // Displays a control that allows the user to choose picture or // movie capture, if both are available: cameraUI.mediaTypes = [UIImagePickerControlleravailableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera]; // Hides the controls for moving & scaling pictures, or for // trimming movies. To instead show the controls, use YES. cameraUI.allowsEditing = NO; cameraUI.delegate = delegate; [controller presentModalViewController: cameraUI animated: YES]; returnYES; }
如果只想讓攝像頭只能攝像,而不能拍照,那應該設置mediaTypes
cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie
, nil];
kUTTypeImage 對應拍照
kUTTypeMovie
對應攝像
這要導入MobileCoreServices.framework,然后再
#import <MobileCoreServices/UTCoreTypes.h>
然后就可以在一個觸發事件中進行調用.
- (IBAction) showCameraUI {
[self startCameraControllerFromViewController: self
usingDelegate: self];
}
2. 設置delegate
在拍攝完成后,要進行delegate的設置,這樣才能夠讓程序互動起來.
- (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker ; 點擊cancel后執行的方法
- (void) imagePickerController: (UIImagePickerController *) picker |
didFinishPickingMediaWithInfo: (NSDictionary *) info; 拍攝完成后要執行的方法 |
// For responding to the user tapping Cancel. - (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker { [[picker parentViewController] dismissModalViewControllerAnimated: YES]; [picker release]; } // For responding to the user accepting a newly-captured picture or movie - (void) imagePickerController: (UIImagePickerController *) picker didFinishPickingMediaWithInfo: (NSDictionary *) info { NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType]; UIImage *originalImage, *editedImage, *imageToSave; // Handle a still image capture if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo) { editedImage = (UIImage *) [info objectForKey: UIImagePickerControllerEditedImage]; originalImage = (UIImage *) [info objectForKey: UIImagePickerControllerOriginalImage]; if (editedImage) { imageToSave = editedImage; } else { imageToSave = originalImage; } // Save the new image (original or edited) to the Camera Roll UIImageWriteToSavedPhotosAlbum (imageToSave, nil, nil , nil); } // Handle a movie capture if (CFStringCompare ((CFStringRef) mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo) { NSString *moviePath = [[info objectForKey: UIImagePickerControllerMediaURL] path]; if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (moviePath)) { UISaveVideoAtPathToSavedPhotosAlbum ( moviePath, nil, nil, nil); } } [[picker parentViewController] dismissModalViewControllerAnimated: YES]; [picker release]; }
// 這個方法就是在拍攝完成后,將圖片或視頻,保存到膠卷相機. 我們所需要的東西都保存在info 這個 NSDictionary中 |
@property (strong,nonatomic) UIPopoverController * popoverViewControl;
在implement中:
- (IBAction)takeImage:(id)sender { if ([self.popoverViewControl isPopoverVisible]) { [self.popoverViewControl dismissPopoverAnimated:YES]; }else { if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeSavedPhotosAlbum]) { UIImagePickerController * picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = NO; picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; // picker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum]; picker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *) kUTTypeMovie , nil]; self.popoverViewControl = [[UIPopoverControlleralloc] initWithContentViewController:picker]; self.popoverViewControl.delegate = self; CGRect popoverRect = [self.view convertRect:[sender frame] fromView:[sender superview]]; popoverRect.size.width = MIN(popoverRect.size.width, 100); [self.popoverViewControl presentPopoverFromRect:popoverRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAnyanimated:YES]; } } } - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { self.imageView.image = [info objectForKey:UIImagePickerControllerOriginalImage]; //imageview是自己定義的一個image view 控件,用來顯示選中的圖片 [self.popoverViewControldismissPopoverAnimated:YES]; }
以上就是UIImagePickerController的大概用法,主要就是自己看了apple的官方文檔,然后實踐后,記錄下來,留用,防止忘了.
對於popover 有一個很好的教程: Using the PopoverView in iPad App Development