Sie können das standardmäßige adaptive Verhalten ( UIModalPresentationFullScreen
in einer kompakten horizontalen Umgebung, z. B. dem iPhone) mithilfe der über
adaptivePresentationStyleForPresentationController:
verfügbaren Methode überschreiben UIPopoverPresentationController.delegate
.
UIPresentationController
Mit dieser Methode werden Sie aufgefordert, den neuen Präsentationsstil zu verwenden. In Ihrem Fall führt das einfache Zurückgeben UIModalPresentationNone
dazu, dass das UIPopoverPresentationController
Format als Popover anstelle von Vollbild angezeigt wird.
Hier ist ein Beispiel für das Popover mit einem Segue-Setup im Storyboard von a UIBarButtonItem
bis " modal präsentieren " aUIViewController
class SomeViewController: UIViewController, UIPopoverPresentationControllerDelegate {
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)
}
}
}
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .None
}
}
Dieser Trick wurde in der WWDC 2014-Sitzung 214 "View Controller Advancement in iOS8" (36:30) erwähnt.
Wenn jemand ein Popover nur mit Code präsentieren möchte, können Sie den folgenden Ansatz verwenden.
ZIEL C
Deklarieren Sie eine Eigenschaft von
UIPopoverPresentationController
:@property(nonatomic,retain)UIPopoverPresentationController *dateTimePopover8;
Verwenden Sie die folgende Methode, um das Popover von UIButton anzuzeigen:
- (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]; }
Verwenden Sie die folgende Methode, um das Popover von UIBarButtonItem anzuzeigen:
- (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]; }
Implementieren Sie diese Delegate-Methode auch in Ihrem View Controller:
- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller { return UIModalPresentationNone; }
Um dieses Popover zu schließen, schließen Sie einfach den View Controller. Unten finden Sie den Code zum Schließen des View Controllers:
-(void)hideIOS8PopOver { [self dismissViewControllerAnimated:YES completion:nil]; }
SCHNELL
Verwenden Sie die folgende Methode, um das Popover von UIButon anzuzeigen:
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) }
Verwenden Sie die folgende Methode, um das Popover von UIBarButtonItem anzuzeigen:
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) }
Implementieren Sie diese Delegate-Methode auch in Ihrem View Controller:
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle{ return .None }
UIPopoverPresentationControllerDelegate
Stellen Sie sicher, dass Sie den Delegaten in der Datei .h / .m / .swift hinzufügenquelle
PROBLEM: Das iPhone-Popover zeigt den Vollbildmodus an und berücksichtigt den Wert für den bevorzugten Inhalt nicht.
LÖSUNG: Entgegen den Vorschlägen von Apple in der UIPopoverPresentationController-Klassenreferenz wird der View Controller angezeigt, nachdem ein Verweis auf den Popover Presentation Controller abgerufen und konfiguriert wurde.
// Get the popover presentation controller and configure it. //... // Present the view controller using the popover style. [self presentViewController:myPopoverViewController animated: YES completion: nil];
quelle
Stellen Sie sicher, dass UIAdaptivePresentationControllerDelegate implementiert ist
so was:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; }
Wenn Sie keine Vollbild-Popover möchten
quelle
Ich habe eine Problemumgehung gefunden.
Verwenden Sie auf Xcode6.1
presentationController.delegate
anstelle vonpopoverPresentationController.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; }
In WWDC 2014 "Controller-Verbesserungen in iOS8 anzeigen" können die folgenden Codes Popover auf dem iPhone anzeigen.
- (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; }
Unter Xcode 6.1 zeigen diese Codes jedoch die Vollbilddarstellung an ... (nvc.popoverPresentationController ist null)
Ich bezweifle, dass es sich um einen Apple-Fehler handelt.
quelle
Verwenden Sie in iOS 8.3 und höher die folgende Syntax im
UIPopoverPresentationControllerDelegate
Protokoll, um die Popups zu überschreibenUIModalPresentationStyle
.func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { return .none }
quelle
Fügen Sie diese beiden Methoden in Ihre WEBVIEW-Klasse ein. und hinzufügen
-(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; }
quelle
Sie können das UIPopoverPresentationControllerDelegate folgendermaßen erweitern:
protocol PopoverPresentationSourceView {} extension UIBarButtonItem : PopoverPresentationSourceView {} extension UIView : PopoverPresentationSourceView {} extension UIPopoverPresentationControllerDelegate where Self : UIViewController { func present(popover: UIViewController, from sourceView: PopoverPresentationSourceView, size: CGSize, arrowDirection: UIPopoverArrowDirection) { popover.modalPresentationStyle = .popover popover.preferredContentSize = size let popoverController = popover.popoverPresentationController popoverController?.delegate = self if let aView = sourceView as? UIView { popoverController?.sourceView = aView popoverController?.sourceRect = CGRect(x: aView.bounds.midX, y: aView.bounds.midY, width: 0, height: 0) } else if let barButtonItem = sourceView as? UIBarButtonItem { popoverController?.barButtonItem = barButtonItem } popoverController?.permittedArrowDirections = arrowDirection present(popover, animated: true, completion: nil) } }
Sie können jetzt
present(popover: from: size: arrowDirection: )
von jedem View Controller aus aufrufen , derUIPopoverPresentationControllerDelegate
z.class YourViewController : UIViewController { @IBAction func someButtonPressed(_ sender: UIButton) { let popover = SomeViewController() present(popover: popover, from: sender, size: CGSize(width: 280, height: 400), arrowDirection: .right) } } extension YourViewController : UIPopoverPresentationControllerDelegate { func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { return .none } }
quelle