web-dev-qa-db-fra.com

UIPopoverController pour iphone ne fonctionne pas?

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?

40
Ravindhiran

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

43
Egor Chiglintsev

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.

65
Philip J. Fry

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.

29
Soberman

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.

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î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;
}

3. Présenter et configurer le popup

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
}
14
Daniel Galasko

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

https://github.com/sammcewan/WYPopoverController

(Cela semble être le meilleur support que j'ai trouvé).

3
CpnCrunch

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.

https://github.com/akeara/AKETooltip

1
erenkabakci

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

0
floohh