Je dois utiliser un UIPopOverController pour mon application iPhone. J'ai cherché quelqu'un dans stackoverflow. J'ai dit que UIPopoverController ne fonctionnait pas sur le périphérique iphone iphone. POURQUOI? .Quand je me lance sur un périphérique iphone, j'ai l'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 l'a dit Soberman, depuis iOS 8, il est possible de présenter des popovers sur un iPhone à l'aide d'API publiques. Cette réponse n'est donc probablement plus pertinente.
Comme indiqué dans la documentation d'Apple sur UIPopoverController } _:
Les contrôleurs Popover sont destinés à être utilisés exclusivement sur des appareils iPad.
Donc, il n'y a malheureusement aucun moyen d'utiliser cette classe dans une application iPhone. Mais il existe quelques implémentations tierces personnalisées de la fonctionnalité fournie par UIPopoverController qui ajoutent la prise en charge de l'iPhone, etc. Voir https://github.com/50pixels/FPPopover _ pour un exemple.
Edit: Il existe également une autre implémentation popover hautement personnalisable pour les deux iPhone/iPad qui vaut la peine 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 popover sur iPhone comme d'habitude.
Mais rappelez-vous qu'il s'agit d'une méthode privée et qu'Apple peut rejeter votre application. Mais je connais des gens qui l'utilisent normalement et Apple a publié leurs applications.
Depuis iOS8, nous sommes maintenant en mesure de créer des popovers, qui seront les mêmes sur iPhone, comme sur iPad, ce qui serait particulièrement impressionnant pour ceux qui créent des applications universelles, évitant ainsi 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 avez à faire est de créer une sous-classe UIViewController
, de vous conformer au protocole UIPopoverPresentationControllerDelegate
et de définir la modalPresentationStyle
souhaitée ainsi que la valeur delegate
:
// This is your CustomPopoverController.m
@interface CustomPopoverController () <UIPopoverPresentationControllerDelegate>
@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 la sous-classe que vous venez de créer dans la méthode à partir de laquelle vous voulez l’afficher, puis affectez deux autres valeurs à sourceView
et sourceRect
. 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 voilà, Nice, popover soignée et floue.
Donc, @Sobermans answer n'a pas vraiment résolu le problème du début à la fin. Je tiens donc à préciser comment je l'ai fait en utilisant les documents . Cela étant dit, j'aime bien l'idée d'utiliser votre propre sous-classe de contrôleur de présentation pour gérer toutes les personnalisations que vous souhaitez afficher.
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.
adaptivePresentationStyleForPresentationController
Par défaut, UIPopoverPresentationController
apparaîtra en plein écran sur iPhone. Pour éviter ce problème, vous devez forcer le style de présentation adaptative à aucun.
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;
}
Nous devons d’abord appeler presentViewController
et ensuite seulement pouvons-nous 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 d'infobulle/popover personnalisée.
Peut être initialisé avec n'importe quelle vue de contenu et ajuste dynamiquement son cadre.
J'espère que ça aide.
Si vous voulez le faire dans Swift, je crois que le code est le suivant:
extension UIPopoverController {
class var _popoversDisabled : Bool {
get { return false }
}
}
Edit: Il fonctionne dans Xcode 6 beta 4 sur iPhone avec iOs7.1