Monotouch在IPAD與IPhone使用UIImagePickerController的圖片選擇不同的代碼


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:      }

總結:

  1. UIImagePickerController必須由UIPopoverController來承載。
  2. 如果presentModalViewController的UIImagePickerController的SourceType為設置到“UIImagePickerControllerSourceTypeCamera”時。設備必須是iPad 2的相機在全屏幕視圖。最大化才是是正確的UIModalPresentationStyle.FullScreen,presentModalViewController的sourceType被設置成任何其他的情況都會崩潰。UIImagePickerController Class Reference

  3. UIPopoverControllers應始終保持在一個實例變量。或建立一個強類型屬性保存。

 

作者:Bruce Lee
出處:http://www.cnblogs.com/BruceLee521
本博原創文章版權歸博客園和本人共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出作者名稱和原文連接,否則保留追究法律責任的權利。

 

實際效果

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM