wake-up-neo.com

Warum deckt 'Popover' den gesamten Bildschirm ab?

In meinem Projekt habe ich einen Button unten rechts auf dem Bildschirm und ich fügte einen weiteren Uiviewcontroller zum Storyboard hinzu, zog Control-Drag auf den Uiviewcontroller, den ich als Popover wollte, stellte dann die Größe des Viewcontrollers auf (300, 300) und überprüfte 'bevorzugte explizite Größe verwenden'. Wenn ich die App lade und auf die Schaltfläche klicke, wird der gesamte Bildschirm vom "Popover" verdeckt. Ich habe auch versucht, in die .m-Datei des popoverViewControllers zu gehen und die Größe festzulegen, aber das hat auch nicht funktioniert.
Irgendwelche Ideen?

Edit: Da es so aussieht, als müsste ich es auf dem ganzen Bildschirm haben, das ist in Ordnung, aber ich habe immer noch Probleme mit anderen Problemen, die ich früher hatte. Mein Popup-Bildschirm erscheint, und ich mache den Hintergrund schwarz und alpha als .5, damit er durchschaut wird. Die Animation wird jedoch ausgeführt. Sobald die Animation beendet ist, wechselt der Bildschirm von .5 auf ganz und gar schwarz Was ich sehen kann, ist das Batteriesymbol.

15
coal175

Das OP verwendet Objective-C. Diese Antwort enthält Code in Swift. Die Konvertierung von Swift in Objective-C sollte einfach sein.

Ändern Sie im neu hinzugefügten ViewController unter "Simulated Metrics" "Size" in "Freeform" und "Statusleiste" in "None". 

Ändern Sie unter "Simulierte Größe" die Höhe und Breite Ihrer Ansicht auf die tatsächliche Größe, die der Popover-Inhalt haben soll.

Erstellen Sie ein Segment zum neu hinzugefügten VC. Verwenden Sie den Segue-Typ als "Präsent als Popover" und geben Sie einen Namen für den Segue an, zum Beispiel "popoverSegue". 

Fügen Sie im ViewConroller, von dem dieses Segment ausgelöst werden soll, das UIPopoverPresentationControllerDelegate-Protokoll hinzu.

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
}

Überschreiben Sie die prepareForSegue-Funktion, um das Popover-Segment zu ermitteln. Setzen Sie modalPresentationStyle auf .Popover, um explizit anzugeben, dass Sie ein Popover wünschen, und weisen Sie dann die Eigenschaft delegate des popoverPresentationController der Ansicht zu self zu:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "popoverSegue" {
            let popoverViewController = segue.destinationViewController as! UIViewController
            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }

Implementieren Sie die adaptivePresentationStyleForPresentationController-Funktion, um Ihrer App mitzuteilen, dass Sie diese Popover-Präsentation wirklich möchten und keine Ersetzungen akzeptieren:

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

Im Anschluss daran konnte ich auf dem iPhone ein Popup-Fenster aufrufen, das nicht den vollen Bildschirm, sondern die für ViewController festgelegte Größe hat. 

 enter image description here

Quelle: iPad Style Popovers auf dem iPhone mit Swift

24
Bharat

Swift 3 Version

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == SEGUE_IDENTIFIER {
            let popoverViewController = segue.destination as! YourViewController

            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }

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

Danke an Bharat für die großartige Antwort , ich persönlich benutze ein UIStoryboardSegue, das ziemlich genau dasselbe macht. Auf diese Weise kann ich die Klasse des Segments im Storyboard ändern, haben, was ich will und meine ViewController nicht verschmutzen:

class AlwaysPopupSegue : UIStoryboardSegue, UIPopoverPresentationControllerDelegate
{
    override init(identifier: String?, source: UIViewController, destination: UIViewController)
    {
        super.init(identifier: identifier, source: source, destination: destination)
        destination.modalPresentationStyle = UIModalPresentationStyle.popover
        destination.popoverPresentationController!.delegate = self
    }
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
}
5
Michel Donais

Auf dem iPhone können Sie einen benutzerdefinierten Ansichts-Controller erstellen, der alle Popover verwalten kann. Da jeder Ansichtscontroller über einen eigenen Navigationscontroller verfügt, können Sie dem app.window.rootviewcontroller einen neuen Viewcontroller als Du-View hinzufügen und alles in den Vordergrund stellen.

Wenn Sie nicht selbst schreiben möchten, können Sie beispielsweise Folgendes verwenden: http://cocoapods.org/pods/FPPopover

0
Chitimalli

Swift 4 Version

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SegueIdentifier" {
            let popoverViewController = segue.destination
            popoverViewController.modalPresentationStyle = .popover
            popoverViewController.presentationController?.delegate = self
     }
}

Vergiss nicht hinzuzufügen

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