UIImagePickerController 大部份都是被使用來實作照相機(Photo)的功能,有別與使用 AVFoundation Framework 來實作攝影機(Video),如果你想要瞭解 AVFoundation 的操作方式,可以參考Camera / 攝影機畫面的擷取方式-前篇一文,與Camera / 攝影機畫面的擷取方式-後篇ㄧ文。下列我們就來示範了如何使用 UIImagePickerController 來實作照相機的基本功能,其程式碼如下。
在開始實做這些功能之前,要先替我們的 ViewController 加上代理方法,設定的方式是來到 ViewController.h 程式中的 @Interface 區段並增加 UINavigationControllerDelegate 與 UIImagePickerControllerDelegate 兩個代理,此目的是可以讓我們在 ViewController 下直接呼叫 UIImagePickerController 所產生的畫面。
@interface MLViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
接下來我們再按鈕事件中實作呼叫 UIImagePickerController 相機的介面設定,程式碼如下。
- (IBAction)onCameraButtonPress:(id)sender {
//建立一個ImagePickerController
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
//設定影像來源
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.delegate = self;
imagePicker.allowsEditing = YES;
//顯示Picker
[self presentModalViewController:imagePicker animated:YES];
}
最後就是實作當使用者按下「使用」這張影像時的動作,我們只要將實作的內容寫在一個 UIImagePickerController 的內建函式即可。
//使用代理之後才會出現的內建函式
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
//取得影像
UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
//將影像縮小顯示於畫面中央(原圖是480*960)
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
[imageView setFrame:CGRectMake(0.0, 0.0, 160.0, 240.0)];
[imageView setCenter:self.view.center];
[self.view addSubview:imageView];
//移除Picker
[picker dismissModalViewControllerAnimated:YES];
}
另外如果你有相機介面語系的問題(沒意外的話,操作介面應該是英文),請到專案下的 InfoPlist.strings 檔案,在它的 Localization 屬性下新增一個你想要的語系即可(Zh-Hans 代表簡體中文,Zh-Hant 代表繁體中文),若是在你的專案中找不到 InfoPlist.strings 檔案,可以手動為專案新增一個 Strings File 即可。
ps:如果您想要將影像存至圖片庫中,可以參考將影像存至相簿 Album 的方法ㄧ文。
這篇教學我接收了,謝啦:)
回覆刪除您好 cg2010studio:
刪除不用客氣,謝謝你喜歡我們的文章!
牛奶您好,
回覆刪除請問重新拍攝跟使用這兩個鍵可以偵測他的動作嗎??
鈞 您好:
刪除你點擊UIImagePickerControllerDelegate時可以查閱他有哪些函式可以使用:
@protocol UIImagePickerControllerDelegate
@optional
// The picker does not dismiss itself; the client dismisses it in these callbacks.
// The delegate will receive one or the other, but not both, depending whether the user
// confirms or cancels.
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0);
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
@end
我想你要的函式都在這裡,祝你順利!
謝謝!!- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker; 是取消鍵
刪除(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0);這被禁用了
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;
這use後才會進去
重新拍攝我找不到可控制的@@
我現在用的方法是把
刪除showsCameraControls = NO;
然後自己做cameraOverlayView
您好:
刪除重新拍攝我想可能就是回到拍攝畫面再繼續其他的動作,如果要捕捉這個關鍵時刻,可能要改寫UIImagePickerController裡面的方法才行,或是直接增加一個自定的按鈕:
http://stackoverflow.com/questions/16852601/custom-use-cancel-retake-and-reverse-camera-button-event-using-uiimagep
http://stackoverflow.com/questions/5429509/how-to-implement-custom-use-and-retake-button-in-uiimagepicker
然後是你的解決方式
http://stackoverflow.com/questions/1853822/is-there-a-delegate-method-that-gets-called-when-the-user-pressed-retake-on-th
目前就只有這幾種方式來解決這個問題,不過我不去定這是否會影響你app的上架審核!
謝謝你!!!
刪除