2012-01-26 13 views
17

हाय मैं एक सार्वभौमिक अनुप्रयोग (आईफोन/आईपैड) पर काम कर रहा हूं। एक विशेषता यह है कि मुझे एल्बम से एक फोटो चुनना है और इसे UIImageView पर दिखाना है।आईपैड में UIImagePickerController का उपयोग कैसे करें?

अब समस्या यह है कि यह आईफोन पर अच्छा काम कर रहा है लेकिन जब मैं फोटो एलबम खोलने की कोशिश करता हूं तो यह दुर्घटनाग्रस्त हो जाता है। एक्शन शीट प्रतिनिधि में मेरा कोड यह है:

- (void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){ 
     if (([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])) 

     { 
      if (buttonIndex == 0) 
      { 
       [self lockAllImagesOnTheScreen]; 
       imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 
      if (buttonIndex == 1) 
      { 
       [self lockAllImagesOnTheScreen]; 

       imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 

     } 
     else { 

      if (buttonIndex == 0) 
      { 
       [self lockAllImagesOnTheScreen]; 
       imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
       imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 
     } 



    } 

    else{ 
     if (([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])) 

     { 
      if (buttonIndex == 0) 
      { 
       [self lockAllImagesOnTheScreen]; 
       imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 
      if (buttonIndex == 1) 
      { 
       [self lockAllImagesOnTheScreen]; 

       imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 

     } 
     else { 

      if (buttonIndex == 0) 
      { 
       [self lockAllImagesOnTheScreen]; 
       imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
       imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 
     } 


    } 


} 

कोई भी शरीर मेरी मदद कर सकता है? मैंने स्टैक ओवरफ्लो पर जांच की है और इसे भी गुमराह किया है लेकिन व्यर्थ में।

+0

यदि कोई भी भक्त करता है तो कृपया इसके कारण भी लिखें, cz मैंने इसे समझने के लिए पहले कोशिश की है, लेकिन मुझे कुछ भी मदद नहीं मिली, इसलिए मैंने इस प्रश्न को यहां पूछा क्यों – Mashhadi

+0

अपवाद क्या है? अगर यह स्मृति है, तो क्या आपने NSZombiesEnabled की कोशिश की है? – gerry3

+0

"कार्यक्रम सिग्नल सिग्बेट प्राप्त हुआ" यह अपवाद – Mashhadi

उत्तर

56

UIImagePickerController को UIPopoverController के साथ आईपैड पर प्रस्तुत किया जाना चाहिए।

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker]; 
    [popover presentPopoverFromRect:self.selectedImageView.bounds inView:self.selectedImageView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    self.popOver = popover; 
} else { 
    [self presentModalViewController:picker animated:YES]; 
} 

संपादित: UIPopoverController के लिए एक मजबूत संपत्ति जोड़ें:

@property (nonatomic, strong) UIPopoverController *popOver; 

पॉपओवर प्रतिनिधि तरीकों में बर्खास्त कर दिया जाना चाहिए:

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

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
+0

की सहायता नहीं कर रहा है यह उत्तर अपूर्ण है। self.popOver क्या है? –

+7

प्रस्तुत कोड में इसकी कोई परिभाषा नहीं है, यह अधूरा नहीं है, आपको केवल लाइनों के बीच पढ़ना होगा ... जाहिर है self.popOver टाइप 'UIPopoverController' की एक संपत्ति है, जिसका संभवतः बाद में पॉपअप को बंद करने के लिए उपयोग किया जाता है । बस कहें ' – mprivat

+3

नहीं, यह अपूर्ण है। अगर हमें "लाइनों के बीच पढ़ना" माना जाता है तो हमें कम से कम "पढ़ने" की दिशा की आवश्यकता होती है। यह एक सीखने का मंच है। आपके आईओएस अनुभव के लिए बधाई लेकिन कठोर होने की कोई जरूरत नहीं है। – edthethird

5

एप्पल डॉक्स कहना

"Present the user interface by calling the presentViewController:animated:completion: method of the currently active view controller, passing your configured image picker controller as the new view controller. On iPad, present the user interface using a popover. Doing so is valid only if the sourceType property of the image picker controller is set to UIImagePickerControllerSourceTypeCamera."

यह कहता है कि यह कैसे व्यवहार करता है इसके ठीक विपरीत है?! आप एक पॉपओवर से UIImagePickerControllerSourceTypeCamera प्रस्तुत कर सकते हैं और आप UIImagePickerControllerSourceTypePhotoLibrary और UIImagePickerControllerSourceTypeSavedPhotosAlbum को सामान्य रूप से प्रस्तुत कर सकते हैं।

import UIKit 
class StoreItemViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate 
{ 
    @IBOutlet weak var button: UIButton! 
    @IBOutlet weak var productImage: UIImageView! 
    var popOver:UIPopoverController? 

    @IBAction func buttonSelected(sender:UIButton) 
    { 
     if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.SavedPhotosAlbum) 
     { 
      var imagePickerController = UIImagePickerController() 
      imagePickerController.delegate = self 
      imagePickerController.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum 
      imagePickerController.allowsEditing = false 

      if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad 
      { 
       self.popOver = UIPopoverController(contentViewController: imagePickerController) 
       self.popOver?.presentPopoverFromRect(self.productImage.bounds, inView: self.productImage, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)  
      } 
      else 
      { 
       self.presentViewController(imagePickerController, animated: true, completion: { imageP in 

       }) 
      } 
     } 
    } 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { 
     //do anything with the image 
     let selectedImage = info[UIImagePickerControllerOriginalImage] as UIImage 

     //closing the popup 
     popOver?.dismissPopoverAnimated(true) 

    } 

    func imagePickerControllerDidCancel(picker: UIImagePickerController) 
    { 
     println("cancel") 

     //closing the popup 
     popOver?.dismissPopoverAnimated(true) 
    } 
} 
6

यहाँ मैं तुम्हें स्विफ्ट रास्ता दिखाने

में कोशिश जोड़ने पॉपओवर नियंत्रक

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ }];

कारण: यह वह जगह है क्योंकि आईओएस 8 में, अलर्ट व्यू और एक्शन शीट्स वास्तव में व्यू कंट्रोलर (यूआईएलर्ट कंट्रोलर) प्रस्तुत किए जाते हैं। इसलिए, यदि आप UIAlertView से किसी कार्रवाई के जवाब में एक नया दृश्य नियंत्रक पेश कर रहे हैं, तो यह प्रस्तुत किया जा रहा है जबकि UIAlertController को खारिज कर दिया जा रहा है। नेविगेशन को परेशान किए बिना आपको मुख्य कतार पर ऐसा करने की आवश्यकता है।

0

यदि डिवाइस आईपैड है और स्रोत प्रकार निर्दिष्ट है 'photoLibrary' या 'savedPhotosAlbum' UIImagePickerController को सेब दस्तावेज़ों के अनुसार पॉपओवर प्रस्तुत किया जाना चाहिए। मेरे मामले में, मैं इस तरह अपना लक्ष्य प्राप्त करता हूं;

func choosePhotoFromLibrary() { 
    let imagePicker = UIImagePickerController() 
    imagePicker.sourceType = .photoLibrary 
    imagePicker.delegate = self 
    imagePicker.allowsEditing = true 

    if UIDevice.current.userInterfaceIdiom == .pad { 
     imagePicker.modalPresentationStyle = .popover 
     present(imagePicker, animated: true, completion: nil) 

     let imagePickerPopOverPresentationController = imagePicker.popoverPresentationController 
     imagePickerPopOverPresentationController?.permittedArrowDirections = .up 

     let photoPickingTableCell = tableView.cellForRow(at: IndexPath(row: 2, section: 0)) 

     imagePickerPopOverPresentationController?.sourceView = photoPickingTableCell 
     imagePickerPopOverPresentationController?.sourceRect = profilePhotoImageView.frame 
    } 
    else { 
     present(imagePicker, animated: true, completion: nil) 
    } 
} 

मेरे पास एक टेबल व्यू सेल है जिसमें एक छवि दृश्य शामिल है। उस सेल को चुनने के लिए छवि पिकर नियंत्रक खोलने की आवश्यकता है, इसलिए कॉलफोटोफ्रेम लाइब्रेरी विधि चुनें। इस विधि में, यदि डिवाइस पैड है, तो छवि पिकर की प्रस्तुति शैली पॉपओवर असाइन करें और इसे प्रस्तुत करें। फिर, पॉपओवर व्यवहार को कॉन्फ़िगर करें। मेरे मामले में, मेरा स्रोत दृश्य तालिका कक्ष है जिसमें छवि दृश्य शामिल है, और मेरा स्रोत संदर्भ छवि दृश्य का फ्रेम है।

यदि आप प्रतिनिधि को असाइन करते हैं तो आप UIPopoverPresentationControllerDelegate विधियों से भी लाभ उठा सकते हैं।

संबंधित मुद्दे