ios objective-c iphone popover

ios - UIPopoverPresentationController en iPhone no produce popover



objective-c (4)

Estoy tratando de implementar el nuevo UIPopoverPresentationController en mi aplicación para iPhone (usando Objective C). Lo que quiero es un popover simple con una vista de 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 guión gráfico:

Sin embargo, esto simplemente presenta una vista de tabla de manera modal, elevándose desde abajo y consumiendo toda la pantalla.

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

¿Alguien puede ver una falla en mi código o dirigirme a un tutorial claro? He mirado, pero tal vez la API es tan nueva 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 de gris, solo para aclarar lo que se muestra en lugar del popover.


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

Sin embargo, todavía es posible obtener elementos emergentes de estilo iPad en el iPhone si presenta manualmente el controlador de vista que desea mostrar como elemento emergente. Código Swift de ejemplo:

// 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) } }


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


Pasos:

A) Enlace su UIButton al controlador de vista de popover usando el tipo de segmento Present As Popover . De hecho, tuve que crear un nuevo proyecto para que esto apareciera, pero probablemente sea algo relacionado con el SDK base.

B) Haga que el controlador de vista que contiene el UIButton ajuste al <UIPopoverPresentationControllerDelegate> . Por ejemplo, en su archivo MyViewController.m agregue:

@interface MyViewController () <UIPopoverPresentationControllerDelegate>

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:

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

#import "TPOPViewController.h" @interface TPOPViewController () <UIPopoverPresentationControllerDelegate>//, 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:


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 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 = .up 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 } }