UIImagePickerController雖然可以用在IPAD與IPhone,但代碼有所不同。
IPhone的代碼如下:
1: partial void SelectImage(NSObject sender, MonoTouch.UIKit.UIEvent @event) {
2: UIImagePickerController picker = new UIImagePickerController ();
3: picker.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
4: picker.Delegate = new MyImagePickerDelegate (this);
5: this.PresentModalViewController (picker,true);
6: }
7:
8: public class MyImagePickerDelegate : UIImagePickerControllerDelegate
9: {
10: MYTableViewController _mvc;
11: public MyImagePickerDelegate (MYTableViewController mvc)
12: {
13: _mvc = mvc;
14: }
15: public override void FinishedPickingImage(UIImagePickerController picker, UIImage image, NSDictionary editingInfo) {
16: // TODO: Implement - see: http://go-mono.com/docs/index.aspx?link=T%3aMonoTouch.Foundation.ModelAttribute
17: }
18:
19: public override void Canceled(UIImagePickerController picker) {
20: // TODO: Implement - see: http://go-mono.com/docs/index.aspx?link=T%3aMonoTouch.Foundation.ModelAttribute
21: }
22: }
這段代碼在IPhone下是正常的,但在IPAD上會報如下異常
MonoTouch.Foundation.MonoTouchException: Objective-C exception thrown. Name: NSInvalidArgumentException Reason: On iPad, UIImagePickerController must be presented via UIPopoverController
為什么呢?就和異常提的一樣。UIImagePickerController必須由UIPopoverController來承載。
IPAD代碼:
1: //static UIImagePickerController imagePicker = new UIImagePickerController();
2: //static UIPopoverController popOver = new UIPopoverController (imagePicker);
UIImagePickerController imagePicker;
UIPopoverController popOver;3: partial void SelectImage(NSObject sender, MonoTouch.UIKit.UIEvent @event) {
4: //UIImagePickerController picker = new UIImagePickerController ();
5: //picker.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
6: //picker.Delegate = new MyImagePickerDelegate (this);
7: //this.PresentModalViewController (picker,true);
8:
9: if (popOver == null || popOver.ContentViewController == null)
10: {
11: imagePicker = new UIImagePickerController();
12: popOver = new UIPopoverController(imagePicker);
13: ImagePickerDelegate imgDel = new ImagePickerDelegate();
14: imagePicker.Delegate = imgDel;
15: imagePicker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary;
16: }
17: if (popOver.PopoverVisible)
18: {
19: popOver.Dismiss(true);
20: imagePicker.Dispose();
21: popOver.Dispose();
22: return;
23: }
24: else
25: {
26: popOver.PresentFromRect(((UIButton)sender).Frame, this.View, UIPopoverArrowDirection.Any, true);
27: }
28:
29: }
public override void ViewDidLoad()
{
imagePicker = new UIImagePickerController();
popOver = new UIPopoverController(imagePicker);
base.ViewDidLoad();
}注意把2個Control設置成靜態的,否則會報錯[UIPopoverController dealloc] reached while popover is still visible.
也可以不設置成靜態變量,但要聲明為類成員變量或屬性,然后再ViewDidLoad方法初始化,就是避免在要使用的時候已經被GC回收了。
原因還是GC,所以一個很好的做法是UIPopoverControllers應始終保持在一個實例變量。或建立一個強類型屬性。
1: public class ImagePickerDelegate : UIImagePickerControllerDelegate
2: {
3: public ImagePickerDelegate()
4: {}
5:
6: public override void FinishedPickingMedia(UIImagePickerController picker, NSDictionary info)
7: {
8: UIImage image = (UIImage)info.ObjectForKey(new NSString("UIImagePickerControllerOriginalImage"));
9: // do whatever else you'd like to with the image
10: }
11: }
總結:
- UIImagePickerController必須由UIPopoverController來承載。
- 如果presentModalViewController的UIImagePickerController的SourceType為設置到“UIImagePickerControllerSourceTypeCamera”時。設備必須是iPad 2的相機在全屏幕視圖。最大化才是是正確的UIModalPresentationStyle.FullScreen,presentModalViewController的sourceType被設置成任何其他的情況都會崩潰。UIImagePickerController Class Reference
- UIPopoverControllers應始終保持在一個實例變量。或建立一個強類型屬性保存。
作者:Bruce Lee
出處:http://www.cnblogs.com/BruceLee521
本博原創文章版權歸博客園和本人共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出作者名稱和原文連接,否則保留追究法律責任的權利。
實際效果