Bonjour, je travaille sur une application universelle (iPhone/iPad). Une caractéristique est que je dois sélectionner une photo de l'album et la montrer sur UIImageView.
Maintenant, le problème est que cela fonctionne bien sur iPhone, mais lorsque j'essaie d'ouvrir un album photo, il se bloque. mon code dans la fiche d'action délégué est la suivante:
- (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];
}
}
}
}
est-ce qu'un corps peut m'aider? J'ai vérifié sur stackOverflow et l'ai également cherché dans Google mais en vain.
UIImagePickerController
doit être présenté avec UIPopoverController
sur iPad.
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];
}
EDIT: Ajoute une propriété forte à la UIPopoverController
:
@property (nonatomic, strong) UIPopoverController *popOver;
Le popover doit être ignoré dans les méthodes déléguées:
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
Ici je vous montre la manière rapide:
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)
}
}
Les documents Apple disent
"Présentez l'interface utilisateur en appelant la méthode PresentViewController: animée: complétion: du contrôleur de vue actif actuellement , En transmettant votre contrôleur de sélecteur d'images configuré En tant que nouveau contrôleur de vue. iPad, présentez l'interface utilisateur à l'aide d'un popover. Cette action n'est valide que si la propriété sourceType du contrôleur du sélecteur d'images est définie sur UIImagePickerControllerSourceTypeCamera. "
Cela dit exactement le contraire de la façon dont il se comporte?!? Vous pouvez présenter UIImagePickerControllerSourceTypeCamera
à partir d'un popover et vous pouvez présenter UIImagePickerControllerSourceTypePhotoLibrary
et UIImagePickerControllerSourceTypeSavedPhotosAlbum
modalement.
Étrange...
POST iOS 8: Essayez d’ajouter un contrôleur popOver dans
[[NSOperationQueue mainQueue] addOperationWithBlock: ^ {}];
Raison: En effet, dans iOS 8, les vues d'alerte et les feuilles d'action sont en réalité des contrôleurs de vue présentés (UIAlertController). Ainsi, si vous présentez un nouveau contrôleur de vue en réponse à une action de UIAlertView, il est présenté pendant le licenciement de UIAlertController. Vous devez le faire en file d'attente principale sans perturber la navigation.
Si l'appareil est un iPad et que le type de source est spécifié, "photoLibrary" ou "savedPhotosAlbum", UIImagePickerController doit être présenté conformément aux documents Apple. Dans mon cas, j'atteins mon objectif comme ceci;
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)
}
}
J'ai une cellule de vue de tableau qui comprend une vue d'image. La sélection de cette cellule doit ouvrir le contrôleur du sélecteur d'images. Par conséquent, la méthode ChoosePhotoFromLibrary est appelée. Dans cette méthode, si le périphérique est un pad, assignez le style de présentation du sélecteur d’image et présentez-le. Ensuite, configurez le comportement de popover. Dans mon cas, mon sourceView est une cellule de tableau qui inclut une vue, et mon sourceRect est le cadre de la vue.
Vous pouvez également bénéficier des méthodes UIPopoverPresentationControllerDelegate si vous affectez un délégué.