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