UIPopoverController pour iphone ne fonctionne pas?

Je dois utiliser un UIPopOverController pour mon application iPhone, j’ai cherché stackoverflow quelqu’un a dit que UIPopoverController ne fonctionnait pas sur le iphone iphone POURQUOI? Quand je cours sur iphone j’ai eu cette reason: '-[UIPopoverController initWithContentViewController:] called when not running under UIUserInterfaceIdiomPad.' erreur reason: '-[UIPopoverController initWithContentViewController:] called when not running under UIUserInterfaceIdiomPad.'

  -(void)btnSetRemainderTapped:(UIButton *)button { setReminderView =[[SetRemainderView alloc]initWithNibName:@"SetRemainderView" bundle:[NSBundle mainBundle]]; setReminderView.contentSizeForViewInPopover = CGSizeMake(setReminderView.view.frame.size.width, setReminderView.view.frame.size.height); setReminderView.delegate = self; popOverController = [[UIPopoverController alloc] initWithContentViewController:setReminderView] ; CGRect rect = CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/2, 1, 1); [popOverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } 

Quelqu’un peut-il m’aider?

Edit: Comme indiqué par Soberman, depuis iOS 8, il est possible de présenter des popovers sur iPhone en utilisant des API publiques, donc cette réponse n’est probablement plus pertinente.


Comme indiqué dans la documentation d’Apple sur UIPopoverController :

Les contrôleurs Popover sont exclusivement destinés aux appareils iPad.

Il n’y a donc aucun moyen d’utiliser cette classe dans une application iPhone malheureusement. Mais il existe quelques implémentations tierces personnalisées des fonctionnalités fournies par UIPopoverController qui ajoutent la prise en charge de l’iPhone et bien plus encore. Voir https://github.com/50pixels/FPPopover par exemple.

Edit: Il y a aussi une autre mise en œuvre de popover hautement personnalisable pour iPhone / iPad qui mérite d’être vérifiée: https://github.com/nicolaschengdev/WYPopoverController .

Vous pouvez utiliser popoverController dans les applications iPhone.

1. Créer une catégorie

 // UIPopoverController+iPhone.h file @interface UIPopoverController (iPhone) + (BOOL)_popoversDisabled; @end // UIPopoverController+iPhone.m file @implementation UIPopoverController (iPhone) + (BOOL)_popoversDisabled { return NO; } @end 

2. Importez-le dans votre classe et utilisez le popover dans l’iPhone comme d’habitude.

Mais rappelez-vous que c’est une méthode privée et Apple peut rejeter votre application. Mais je connais des personnes qui l’utilisent normalement et Apple a publié leurs applications.

Depuis iOS 8, nous sums maintenant en mesure de créer des popovers, qui seront les mêmes sur iPhone, comme sur iPad, ce qui serait particulièrement génial pour ceux qui créent des applications universelles, donc pas besoin de créer des vues ou du code séparés.

Vous pouvez obtenir le cours ainsi que le projet de démonstration ici: https://github.com/soberman/ARSPopover

Tout ce que vous devez faire est de sous-classe UIViewController , conformez-vous au protocole UIPopoverPresentationControllerDelegate et définissez le modalPresentationStyle souhaité avec la valeur de delegate :

 // This is your CustomPopoverController.m @interface CustomPopoverController ()  @end @implementation CustomPopoverController.m - (instancetype)init { if (self = [super init]) { self.modalPresentationStyle = UIModalPresentationPopover; self.popoverPresentationController.delegate = self; } return self; } - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; //You have to specify this particular value in order to make it work on iPhone. } 

Ensuite, instanciez votre sous-classe nouvellement créée dans la méthode à partir de laquelle vous souhaitez l’afficher et affectez deux valeurs supplémentaires à sourceView et à sourceView . Cela ressemble à ceci:

 CustomPopoverController *popoverController = [[CustomPopoverController alloc] init]; popoverController.popoverPresentationController.sourceView = sourceView; //The view containing the anchor rectangle for the popover. popoverController.popoverPresentationController.sourceRect = CGRectMake(384, 40, 0, 0); //The rectangle in the specified view in which to anchor the popover. [self presentViewController:popoverController animated:YES completion:nil]; 

Et ça y est, bon, popover net flou.

Donc, la réponse de @Sobermans n’a pas vraiment résolu le problème du début à la fin, donc je veux détailler comment je l’ai fait en utilisant les documents . Cela étant dit, j’aime l’idée d’utiliser votre propre sous-classe de contrôleur de présentation pour gérer toute la personnalisation que vous souhaitez présenter.

1. Créez votre contrôleur pour présenter

La première étape consiste à instancier le contrôleur que vous souhaitez présenter:

 let vc: UIViewController = ... vc.modalPresentationStyle = .Popover vc.preferredContentSize = CGSize(width: CGRectGetWidth(view.bounds)/2, height: 100) 

Nous avons maintenant un contrôleur avec le style de présentation popover et une taille de contenu arbitraire.

2. Implémenter adaptivePresentationStyleForPresentationController

Par défaut, UIPopoverPresentationController apparaît en plein écran sur iPhone. Pour éviter ce comportement, vous devez forcer le style de présentation adaptative à ne rien afficher.

Nous définissons d’abord le délégué du contrôleur de présentation popover

 vc.popoverPresentationController.delegate = self; 

Ensuite, nous implémentons UIPopoverPresentationControllerDelegate

 func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { return .None; } 

3. Présenter et configurer popup

Nous devons d’abord appeler presentViewController et seulement après cela, nous pouvons configurer le popover:

 presentViewController(vc, animated:true, completion:nil) if let popover = vc.popoverPresentationController { popover.permittedArrowDirections = .Right | .Left popover.sourceView = button popover.sourceRect = button.bounds } 

Utilisez un contrôleur de popover personnalisé, tel que:

https://github.com/sammcewan/WYPopoverController

(cela semble être le meilleur supporté que j’ai trouvé).

J’ai fini par créer ma classe info-bulle / popover personnalisée.

Peut être initialisé avec n’importe quelle vue de contenu et ajuste dynamicment son cadre.

J’espère que cela aide.

https://github.com/akeara/AKETooltip

Si vous voulez le faire dans Swift, je pense que le code est le suivant:

 extension UIPopoverController { class var _popoversDisabled : Bool { get { return false } } } 

Edit: Il travaille dans Xcode 6 beta 4 sur iPhone avec iOs7.1

C’est un fil vraiment intéressant (et déprimant) à lire. Je ne peux pas croire qu’Apple empêche les boîtes de dialog contextuelles sur les iPhones, sans aucune justification.

Et, c’est vrai, sur iOS 8, si vous essayez de contourner cette limitation, vos fenêtres pop-up apparaîtront comme une boîte de dialog modale plein écran.

L’excellente page Web suivante décrit “Comment Apple Cheats” pour laisser ses propres applications iBooks et iTunes enfreindre ses propres règles, et autoriser les fenêtres contextuelles – mais uniquement à partir de leurs propres applications iPhone.

HowAppleCheats

A lire (attention: ça vous détestera encore plus Apple et XCode ..)

Voulez-vous contourner le ” UIPopoverController appelé quand ne fonctionne pas sous UIUserInterfaceIdiomPad ” erreur sur iOS 8?

Simple.

Allez simplement dans votre fichier .plist et changez l’ID de com.apple.itunesucom.apple.itunesu ” pour que XCode pense que votre application est réellement iTunes.

Ensuite, votre popup fonctionnera correctement.

entrer la description de l'image ici

(Soupir.)

La manière alternative de le faire est d’append directement votre UIViewController à votre écran.

Apparaitre

Dans cet exemple, je souhaitais qu’un “écran d’aide” apparaisse sur l’écran de mon iPhone. C’est un UIViewController , il est stocké dans son propre fichier .xib, et il a quelques lignes pour append une jolie bordure:

 - (void)viewDidLoad { [super viewDidLoad]; // Give our popup a pretty curved border self.view.layer.borderColor = [[UIColor blueColor] CGColor]; self.view.layer.borderWidth = 1.0; self.view.layer.cornerRadius = 8; } 

Pour l’afficher, je crée simplement une instance de ce UIViewController , l’ajoute à mon écran, puis le centre:

 -(void)showHelperScreen { if (self.helperScreen == nil) { // Add the popup UIViewController to our screen self.helperScreen = [[HelperViewController alloc] init]; [self.view addSubview:self.helperScreen.view]; } // Center the popup in the middle of the screen CGSize screenSize = [[UIScreen mainScreen] applicationFrame].size; self.helperScreen.view.center = CGPointMake(screenSize.width/2, screenSize.height/2); } 

Bien sûr, je devais aussi append du code pour faire disparaître le popup lorsque l’utilisateur tapait à l’extérieur, mais cela montre au moins que vous pouvez afficher (en toute sécurité) des popups sur un iPhone, même si votre application n’est pas spécifiquement appelée iTunes ou iBook.

Voila.

J’espère que ça aide, et si quelqu’un a besoin de moi, je serai de retour dans mon lieu sûr et sécurisé (Visual Studio, en d’autres termes).