objective-c iphone uipopovercontroller ios8 uipopover

objective c - UIPopoverPresentationController en iOS 8 iPhone



objective-c uipopovercontroller (7)

Asegúrese de implementar UIAdaptivePresentationControllerDelegate

Me gusta esto:

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

Si no quieres popovers a pantalla completa

¿Alguien sabe si UIPopoverPresentationController se puede utilizar para presentar popovers en iPhones? Preguntándose si Apple agregó esta característica en iOS 8 en su intento de crear un controlador de presentación más unificado para iPad y iPhone.

No estoy seguro si está bien para hacer / responder preguntas de Beta. Lo eliminaré en ese caso.


En iOS 8.3 y posterior, use la siguiente sintaxis en el protocolo UIPopoverPresentationControllerDelegate para anular el UIModalPresentationStyle su ventana emergente.

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { return .none }


He encontrado alguna solución.

En Xcode6.1, use presentationController.delegate lugar de popoverPresentationController.delegate .

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier compare:@"showPopOver"] == NSOrderedSame) { UINavigationController * nvc = segue.destinationViewController; UIPresentationController * pc = nvc.presentationController; pc.delegate = self; } } #pragma mark == UIPopoverPresentationControllerDelegate == - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; }

En WWDC 2014 "Ver avances del controlador en iOS8", a continuación, los códigos pueden mostrar popover en iPhone.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UINavigationController * nvc = segue.destinationViewController; UIPopoverPresentationController * pvc = nvc.popoverPresentationController; pvc.delegate = self; } #pragma mark == UIPopoverPresentationControllerDelegate == - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; }

Pero en Xcode 6.1, estos códigos muestran la presentación de FullScreen ... (nvc.popoverPresentationController es nulo)

Dudo que sea un error de Apple.


Puede anular el comportamiento adaptativo predeterminado ( UIModalPresentationFullScreen en un entorno horizontal compacto, es decir, iPhone) utilizando el método adaptivePresentationStyleForPresentationController: disponible a través de UIPopoverPresentationController.delegate .

UIPresentationController utiliza este método para solicitar el uso del nuevo estilo de presentación, que en su caso, simplemente al devolver UIModalPresentationNone hará que UIPopoverPresentationController represente como popover en lugar de pantalla completa.

Aquí hay un ejemplo del popover que usa una configuración segue en el guión gráfico de un UIBarButtonItem para " presentar modalmente " un UIViewController

class SomeViewController: UIViewController, UIPopoverPresentationControllerDelegate { // override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { // swift < 3.0 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "PopoverSegue" { if let controller = segue.destinationViewController as? UIViewController { controller.popoverPresentationController.delegate = self controller.preferredContentSize = CGSize(width: 320, height: 186) } } } // MARK: UIPopoverPresentationControllerDelegate //func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle { // swift < 3.0 func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { // Return no adaptive presentation style, use default presentation behaviour return .None } }

Este truco se mencionó en la sesión 214 de la WWDC 2014 "Ver el avance del controlador en iOS8" (36:30)


Si alguien quiere presentar un popover solo con código, puede usar el siguiente enfoque.

C OBJETIVO

Declarar una propiedad de UIPopoverPresentationController :

@property(nonatomic,retain)UIPopoverPresentationController *dateTimePopover8;

Utilice el siguiente método para presentar el popover desde UIButton:

- (IBAction)btnSelectDatePressed:(id)sender { UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:dateVC];/*Here dateVC is controller you want to show in popover*/ dateVC.preferredContentSize = CGSizeMake(280,200); destNav.modalPresentationStyle = UIModalPresentationPopover; _dateTimePopover8 = destNav.popoverPresentationController; _dateTimePopover8.delegate = self; _dateTimePopover8.sourceView = self.view; _dateTimePopover8.sourceRect = sender.frame; destNav.navigationBarHidden = YES; [self presentViewController:destNav animated:YES completion:nil]; }

Utilice el siguiente método para presentar el popover desde UIBarButtonItem:

- (IBAction)btnSelectDatePressed:(id)sender { UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:dateVC];/*Here dateVC is controller you want to show in popover*/ dateVC.preferredContentSize = CGSizeMake(280,200); destNav.modalPresentationStyle = UIModalPresentationPopover; _dateTimePopover8 = destNav.popoverPresentationController; _dateTimePopover8.delegate = self; _dateTimePopover8.sourceView = self.view; CGRect frame = [[sender valueForKey:@"view"] frame]; frame.origin.y = frame.origin.y+20; _dateTimePopover8.sourceRect = frame; destNav.navigationBarHidden = YES; [self presentViewController:destNav animated:YES completion:nil]; }

Implemente este método delegado también en su controlador de vista:

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

Para descartar este popover, simplemente descarte el controlador de vista. A continuación se muestra el código para cerrar el controlador de vista:

-(void)hideIOS8PopOver { [self dismissViewControllerAnimated:YES completion:nil]; }

RÁPIDO

Utilice el siguiente método para presentar el popover desde UIButon:

func filterBooks(sender: UIButon) { let filterVC = FilterDistanceViewController(nibName: "FilterDistanceViewController", bundle: nil) var filterDistanceViewController = UINavigationController(rootViewController: filterVC) filterDistanceViewController.preferredContentSize = CGSizeMake(300, 205) let popoverPresentationViewController = filterDistanceViewController.popoverPresentationController popoverPresentationViewController?.permittedArrowDirections = .Any popoverPresentationViewController?.delegate = self popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem popoverPresentationViewController!.sourceView = self.view; popoverPresentationViewController!.sourceRect = sender.frame filterDistanceViewController.modalPresentationStyle = UIModalPresentationStyle.Popover filterDistanceViewController.navigationBarHidden = true self.presentViewController(filterDistanceViewController, animated: true, completion: nil) }

Utilice el siguiente método para presentar el popover desde UIBarButtonItem:

func filterBooks(sender: UIBarButtonItem) { let filterVC = FilterDistanceViewController(nibName: "FilterDistanceViewController", bundle: nil) var filterDistanceViewController = UINavigationController(rootViewController: filterVC) filterDistanceViewController.preferredContentSize = CGSizeMake(300, 205) let popoverPresentationViewController = filterDistanceViewController.popoverPresentationController popoverPresentationViewController?.permittedArrowDirections = .Any popoverPresentationViewController?.delegate = self popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem popoverPresentationViewController!.sourceView = self.view; var frame:CGRect = sender.valueForKey("view")!.frame frame.origin.y = frame.origin.y+20 popoverPresentationViewController!.sourceRect = frame filterDistanceViewController.modalPresentationStyle = UIModalPresentationStyle.Popover filterDistanceViewController.navigationBarHidden = true self.presentViewController(filterDistanceViewController, animated: true, completion: nil) }

Implemente este método delegado también en su controlador de vista:

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

Asegúrese de agregar delegado UIPopoverPresentationControllerDelegate en el UIPopoverPresentationControllerDelegate .h / .m / .swift


agrega estos dos métodos en tu clase WEBVIEW. y añadir

-(void) prepareForSegue: (UIStoryboardSegue * ) segue sender: (id) sender { // Assuming you''ve hooked this all up in a Storyboard with a popover presentation style if ([segue.identifier isEqualToString: @"showPopover"]) { UINavigationController * destNav = segue.destinationViewController; pop = destNav.viewControllers.firstObject; // This is the important part UIPopoverPresentationController * popPC = destNav.popoverPresentationController; popPC.delegate = self; } } - (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller { return UIModalPresentationNone; }


PROBLEMA: iPhone popover muestra pantalla completa y no respeta el valor de PreferredConizeSize.

SOLUCIÓN: Al contrario de lo que Apple sugiere en la referencia de UIPopoverPresentationController Class, presentando el controlador de vista después de obtener una referencia al controlador de presentación popover y configurarlo.

// Get the popover presentation controller and configure it. //... // Present the view controller using the popover style. [self presentViewController:myPopoverViewController animated: YES completion: nil];