UIPopoverPresentationController en iPhone no produce popover

Estoy tratando de implementar el nuevo UIPopoverPresentationController en mi aplicación de iPhone (usando Objective C). Lo que quiero es un simple popover con una tabla que emana del botón de inicio.

–Editar–

Aquí está mi código REVISADO , adaptado de la investigación en los documentos, SO, y de la entrada en los comentarios a continuación:

 - (IBAction)selectCategoryBtn:(UIButton *)sender { [self performSegueWithIdentifier:@"CatSelectSegue" sender:self.selCatButton]; } -(void) prepareForSegue:(UIStoryboardSegue *) segue Sender:(id) sender { if (sender == self.selCatButton) { if ([segue.identifier isEqualToString:@"CatSelectSegue"]) { UIPopoverPresentationController *controller = segue.destinationViewController; controller.delegate = self; controller.sourceView = self.selCatButton; controller.sourceRect = self.selCatButton.frame; } } } -(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; 

Aquí está mi conexión del storyboard:

enter image description here

Sin embargo, esto simplemente presenta una vista de tabla de forma modal, que se levanta desde la parte inferior y consume toda la pantalla.

Busqué en Google y examiné todo SO, pero parece que no soy el único confundido por lo que esperaba que resolviera un problema irritante para el iPhone.

¿Alguien puede ver un error en mi código o dirigirme a un tutorial claro? Lo he buscado, pero tal vez el API es tan nuevo que nadie lo ha manejado todavía.

¡Gracias!

2da edición:

Esto es lo que se presenta como resultado del código anterior. Reduje el tamaño de la vista de tabla en el Controlador de Vista que esperaba que se presentara como un popover. Coloreé el fondo gris, solo para aclarar lo que aparece en lugar del popover.

enter image description here

Pasos:

A) Vincula tu UIButton al controlador de vista de popover usando el tipo de segmentación Present As Popover . De hecho, tuve que crear un nuevo proyecto para que apareciera, pero es probable que tenga algo que ver con el SDK base.

B) Haga que el Controlador de Vista que contiene el UIButton ajuste al . Por ejemplo, en su archivo MyViewController.m , agregue:

 @interface MyViewController ()  

C) Agregue el siguiente método al controlador de vista que contiene el UIButton :

 - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; } 

D) Agregue lo siguiente en su prepareForSegue:sender: reemplazando su verificación segue.identifier :

 if ([segue.identifier isEqualToString:@"CatSelectSegue"]) { UIViewController *dvc = segue.destinationViewController; UIPopoverPresentationController *controller = dvc.popoverPresentationController; if (controller) { controller.delegate = self; } } 

Código probado y prueba de que funciona:

Popover en iPhone sin controles de terceros

Editar: Mi aplicación de prueba TPOPViewController.m archivo donde ocurre la magia:

 #import "TPOPViewController.h" @interface TPOPViewController () //, UIAdaptivePresentationControllerDelegate> @end @implementation TPOPViewController - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { NSString *identifier = segue.identifier; if ([identifier isEqualToString:@"popover"]) { UIViewController *dvc = segue.destinationViewController; UIPopoverPresentationController *ppc = dvc.popoverPresentationController; if (ppc) { if ([sender isKindOfClass:[UIButton class]]) { // Assumes the popover is being triggered by a UIButton ppc.sourceView = (UIButton *)sender; ppc.sourceRect = [(UIButton *)sender bounds]; } ppc.delegate = self; } } } - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; } @end 

Mi guión gráfico de prueba también:

Guión gráfico de prueba de Popover en iPhone

Aparentemente, el método anterior ya no funciona con iOS9 / Xcode7 . Esto se debe a que si configuras el estilo de transición en “Popover” usando Interface Builder, Xcode lo ignora cuando comstack tu aplicación. Además, automáticamente establece el segue nuevamente en “Push” la próxima vez que abra su proyecto. Si tiene un software de control de versiones como Git, podrá observar este cambio no deseado.

Sin embargo, aún es posible obtener elementos flotantes de estilo iPad en el iPhone si presenta manualmente el controlador de vista que desea mostrar como un popover. Ejemplo de código Swift:

 // ViewController.swift // PopoverDemo // // Created by bhnascar on 12/2/15. // Copyright © 2015 bhnascar. All rights reserved. // import UIKit class ViewController: UIViewController, UIPopoverPresentationControllerDelegate { /* The bar button item that will present the popover. */ var popoverButton: UIBarButtonItem? override func viewDidLoad() { super.viewDidLoad() popoverButton = UIBarButtonItem(title: "Pop!", style: UIBarButtonItemStyle.Plain, target: self, action: "presentPopover") self.navigationItem.rightBarButtonItem = popoverButton } // Mark: - UIPopoverPresentationControllerDelegate func prepareForPopoverPresentation(popoverPresentationController: UIPopoverPresentationController) { popoverPresentationController.permittedArrowDirections = .any popoverPresentationController.barButtonItem = popoverButton } func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { return .none } // Mark: - Callback function for popover button. func presentPopover() { let popoverContentController = UIViewController() popoverContentController.view.backgroundColor = .blue // Set your popover size. popoverContentController.preferredContentSize = CGSize(width: 300, height: 300) // Set the presentation style to modal so that the above methods get called. popoverContentController.modalPresentationStyle = .popover // Set the popover presentation controller delegate so that the above methods get called. popoverContentController.popoverPresentationController!.delegate = self // Present the popover. self.present(popoverContentController, animated: true, completion: nil) } } 

SWIFT 3.X

Esto mostrará el popover en el centro de la pantalla

 class CommonViewController: UIViewController, UIPopoverPresentationControllerDelegate{ func adaptivePresentationStyle( for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { return .none } func showPopover(){ let storyboard = UIStoryboard(name: "Pickers", bundle: nil) let myViewController = UIViewController() myViewController.preferredContentSize = CGSize(width: 320, height: 200) myViewController.modalPresentationStyle = .popover let popOver = myViewController.popoverPresentationController popOver?.delegate = self self.present(myViewController, animated: true, completion: nil) popOver?.permittedArrowDirections = .init(rawValue: 0) popOver?.sourceView = self.view let rect = CGRect( origin: CGPoint(x: self.view.frame.width/2, y: self.view.frame.height/2), size: CGSize(width: 1, height: 1) ) popOver?.sourceRect = rect } 

Para presentar UIModalPresentationStyle popover desde iPhone / iPad:

 -(void)menuButtonPressed:(UIButton *)sender { self.menuPopoverController = [[DownloadMenuPopoverController alloc] initWithStyle:UITableViewStylePlain]; self.menuPopoverController.delegate = self; self.menuPopoverController.modalPresentationStyle = UIModalPresentationPopover; self.menuPopoverController.popoverPresentationController.delegate = self; self.menuPopoverController.preferredContentSize = CGSizeMake(250,80); self.menuPopoverController.popoverPresentationController.sourceRect = sender.frame;// rect to show view self.menuPopoverController.popoverPresentationController.sourceView = self.view; UIPopoverPresentationController *popPC = self.menuPopoverController.popoverPresentationController; popPC.permittedArrowDirections = UIPopoverArrowDirectionAny; popPC.delegate = self; [self presentViewController:self.menuPopoverController animated:YES completion:nil]; } #pragma mark - UIPresentationController Delegate methods - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection { return UIModalPresentationNone; } - (UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style { UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller.presentedViewController]; return navController; }