2010-07-15 6 views
2

Je pense que la question ici est que je suis en train d'appeler un mediaPicker et qui ne supporte pas d'autres orientations ...forces UIPopoverController iPad en orientation Portrait

Quelqu'un at-il une solution pour cela?

Voici mon code actuel:

- (IBAction)openMediaPicker:(id)sender { 
    MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeAnyAudio]; 
mediaPicker.delegate = self; 
mediaPicker.allowsPickingMultipleItems = YES; // this is the default 
    mediaPicker.modalPresentationStyle = UIModalPresentationPageSheet; 
    //mediaPicker.prompt = @"Select items to play"; 
[self presentModalViewController:mediaPicker animated:YES]; 
[mediaPicker release]; 

    // Init a Navigation Controller, using the MediaPicker as its root view controller 
    UINavigationController *theNavController = [[UINavigationController alloc] initWithRootViewController:mediaPicker]; 
    [theNavController setNavigationBarHidden:YES]; 

    // Init the Popover Controller, using the navigation controller as its root view controller 
    popoverController = [[UIPopoverController alloc] initWithContentViewController:theNavController]; 

    // Make a rect at the size and location of the button I use to invoke the popover 
    CGRect popOverRect = chooseMusicButton.frame; 

    // Specify the size of the popover 
    CGSize MySize = CGSizeMake(520.0, 720.0); 

    [popoverController setPopoverContentSize:MySize animated:YES]; 

    // Display the popover 
    [popoverController presentPopoverFromRect:popOverRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    popoverController.delegate = self; 
} 

Répondre

3

Ce code est trop compliqué. D'abord, vous présentez le sélecteur de média de façon modale, puis vous le présentez comme un popover; Pourquoi? Dans le popover, vous le bourrez dans un contrôleur de navigation avant de le présenter; Pourquoi? La présentation d'un sélecteur de support sur iPad est beaucoup plus simple que cela:

MPMediaPickerController* picker = 
    [[[MPMediaPickerController alloc] init] autorelease]; 
picker.delegate = self; 
UIPopoverController* pop = 
     [[UIPopoverController alloc] initWithContentViewController:picker]; 
self.currentPop = pop; 
[pop presentPopoverFromRect:[sender bounds] inView:sender 
     permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
[pop release]; 

qui fonctionne dans tous les sens et survit même rotation tandis que le popover montre.

+0

Je m'étais vraiment rendu compte de l'erreur de mes manières, mais merci de l'avoir rendu si clair pour quelqu'un d'autre qui tombe sur ce Matt! –

0

Tous les contrôleurs modales prédéfinis prennent en charge toutes les orientations, mais ils doivent être présentés à partir du contrôleur de vue racine pour eux de se comporter correctement en orientation et la rotation. Ma conjecture est que le "self" dans votre code n'est pas le contrôleur de vue racine. Vous devrez peut-être réorganiser le code un peu pour que cela se produise si possible.

Il y a d'autres hacks que j'ai vus pour le faire fonctionner sans être présentés depuis le contrôleur de vue racine mais ils semblaient tous demander des problèmes tels que l'extension de UIViewController avec une catégorie pour surcharger interfaceOrientation. Si vous pouvez le présenter depuis le contrôleur de vue racine, ce serait le plus simple et le plus propre, mais je me rends compte que ce n'est pas toujours possible (par exemple, dans une bibliothèque que vous fournissez à des applications tierces).

+0

Étrange. Ce code est dans mon contrôleur de vue racine:/ –

+0

Si self est en effet le contrôleur de vue racine, le problème pourrait être la barre de navigation obtenant le mediaPicker (pas un contrôleur de vue racine) dans son init comme son contrôleur de vue racine. Changez-le en self depuis mediaPicker. Assurez-vous également de ne pas confondre un contrôleur racine (il n'y en a qu'un dans une application liée au délégué de l'application) et tout contrôleur utilisé comme parent d'autres contrôleurs dans une hiérarchie de contrôleurs. La logique de rotation et d'orientation ne fonctionne qu'au niveau le plus élevé et n'est pas propagée dans une hiérarchie de contrôleurs. –

Questions connexes