Ich habe ein Popover mit einem UINavigationController. Ich kann das Popover gut anzeigen, und es enthält den navController ganz gut. Der navController enthält eine Tabellenansicht. Wenn ich ein Element auswähle, wird eine neue Detailansicht erstellt:
DeviceDetailViewController *detailViewController =
[[[DeviceDetailViewController alloc] initWithNibName:@"DeviceDetailViewController" bundle:nil] autorelease];
Ich schiebe es dann auf den neuen View Controller:
[self.navigationController pushViewController:detailViewController animated:YES];
In diesem Fall tritt das Problem auf: Nach dem Drücken der neuen Ansicht wird die Größe des Popovers auf die auf dem iPad verfügbare maximale Höhe geändert.
Ich habe versucht, die Höhe aller Ansichten in der xib auf eine feste Höhe anstatt auf eine flexible einzustellen. Ich habe versucht, die Höhe des Popovers explizit einzustellen. Ich habe auch versucht, verschiedene Ansichts-Controller als untergeordnete Ansicht zu verwenden. Das Problem bleibt bestehen: Das Popover möchte die Größe automatisch auf die maximale Höhe ändern, wenn eine neue Ansicht auf den Navigationscontroller verschoben wird.
In dieser Frage wird der Versuch erörtert, die Größe des Popovers beim Verschieben neuer Ansichten gezielt zu steuern:
Ich dachte, dies könnte eine Brute-Force-Methode sein, um die Größe zu kontrollieren. Seltsamerweise führt dies jedoch zu einigen schnellen Grafikproblemen (als würde die Ansicht frisch animiert), gefolgt von einer weiteren Größenänderung wie oben beschrieben.
Mit anderen Worten, zwingt etwas buchstäblich die popover auf seine maximale Höhe, und es scheint , aufzutreten , nachdem alle aufgerufen wurden.
Ist es der Navigationscontroller? Hat jemand so etwas gesehen?
Ähnlich wie beim Umgang damit
viewWillAppear
besteht eine andere Möglichkeit, damit umzugehen, darin, sie zu überschreibencontentSizeForViewInPopover
. Sehr knapp:quelle
self.view
in Ihrem Fall? Ich habe es gerade noch einmal getestet und es funktioniert immer noch.contentSizeForViewInPopover
können Sie die Größe des Inhalts im Ansichts-Controller festlegen. Diese Eigenschaft ist Lese- / Schreibzugriff und sollte im Allgemeinen nicht überschrieben werden .viewWillAppear
hat es bei mir nie funktioniert, während das Überschreiben des Getters immer funktioniert hat.Für IOS5
Ich empfehle Ihnen, dies zu tun in:
quelle
Ich hatte ein ähnliches Problem.
Ich hatte ein Popover von einer Schaltfläche in einer Symbolleiste. Das Popover wurde auf eine bestimmte Größe eingestellt. Es war eine Tabellenansicht. Bei Auswahl der Tabellenzeile wurde ein neuer View Controller mit einem Navigationscontroller aufgerufen.
Wenn die Schaltfläche "Zurück" ausgewählt wurde, wurde das Popover anstelle der gewünschten Größe die Standardgröße (320 x 1100, glaube ich).
Der ursprüngliche Code war:
Ich habe eine Zeile hinzugefügt, um das Problem zu lösen. Zugegeben, es ist eine Art Umgehung, weil ich die Höhe des Headers subtrahieren musste. Vielleicht könnte einer von euch mich mit einer besseren Methode aufklären. Wie auch immer, es funktioniert.
Ich glaube, wenn ein Navigationscontroller beteiligt ist und die Zurück-Taste gedrückt wird, wird das Popover auf die Standardgröße zurückgesetzt. Durch Hinzufügen der contentSizeForViewInPopover-Eigenschaft für den Ansichtscontroller myVC wird die spezifische Größe erzwungen.
Hoffe das ist hilfreich.
Kurt
quelle
Verwenden Sie für iOS 7 Folgendes:
UIViewController.contentSizeForViewInPopover
wurde zuerst in iOS 7 veraltet.quelle
Als Reaktion auf grafische Störungen mit Animationen:
Die UIPopoverController-Animationen stehen in Konflikt mit den UINavigation Controller-Animationen, wenn Sie das Popover mit einem darin enthaltenen UINavigationController erstellen. Dies führt zu grafischen Störungen beim Animieren. Um das Problem zu beheben, setzen Sie den animierten Parameter beim Drücken anderer Controller oder beim Anzeigen der Symbolleiste auf false.
Pushing View Controller:
Die Symbolleiste sichtbar machen:
Einstellen der Animation: NEIN lässt die Animationen in einem UIPopoverController korrekt aussehen.
quelle
Warum nicht einfach das einstellen,
contentSizeForViewInPopover
bevor Sie den nächsten Controller auf den Navigationsstapel schieben? Keine Notwendigkeit, GrößenviewWillAppear
und dergleichen einzustellen .Funktioniert unter IOS 5.1
quelle
contentSizeForViewInPopover
ist in iOS7 veraltet,preferredContentSize
funktioniert aber auch.Nach dem Rat von borked (der mich in die richtige Richtung gelenkt hat, danke dafür!), Was ich mache, wenn ich einen neuen Controller drücke, um die Größe beizubehalten, bevor ich ihn drücke:
Ich mag das, weil ich die Popover-Werte nicht in jedem View-Controller fest codieren muss (gut, da ich sie in verschiedenen Höhen verwende).
Die
self.contentSizeForViewInPopover
Linie soll die Größe beibehalten, wenn der Benutzer zurückschlägt . Ich denke, Sie könnten diese Zeile woanders platzieren, wieviewWillAppear
oder wo immer Sie möchten.Scheint zu funktionieren ...
quelle
Schreiben Sie in die - (void) viewDidLoad aller View Controller, die Sie in der Navigation verwenden, den folgenden Code:
quelle
Es gibt zwei Möglichkeiten, den contentSizeForViewInPopover im Storyboard festzulegen. Sie können Ihre Ansichts-Controller, die sich in Ihrem Navigations-Controller befinden, auf FreeForm einstellen und die Stammansichten auf die gewünschte Größe einstellen. Sie können die simulierte Metrik auch als abgeleitet beibehalten und "Explizite Größe verwenden" aktivieren und dort die gewünschte Größe festlegen.
Fügen Sie dann in jedem Ansichts-Controller, der sich in Ihrem Navigations-Controller befindet, Folgendes hinzu ...
In der Übergangsanimation wird die neue Ansicht an der Oberseite ausgerichtet und die Höhe entsprechend angepasst.
Auf diese Weise müssen Sie contentSizeForViewInPopover nicht überschreiben oder eine andere Größe speziell in Ihren Ansichtscontrollern angeben. Es ist alles im Storyboard.
Wenn einer Ihrer Ansichts-Controller eine variable Höhe hat, müssen Sie contentSizeForViewInPopover in dieser Ansicht wie folgt überschreiben ...
quelle
Dieses Zeug hat vielleicht einmal funktioniert, aber nicht mit xCode 6, bei dem contentSizeForViewInPopover veraltet ist. Zum Glück wird es beim Laden des Storyboards respektiert. Ich habe einen XML-Editor (Xmplify) heruntergeladen und das Storyboard gehackt. Stellen Sie den Schlüssel contentSizeForViewInPopover auf die gewünschte Größe ein. Speichern und ersetzen Sie das Storyboard (erstellen Sie zuerst eine Kopie).
Genauer :
quelle
Arbeite nicht für mich, wenn ich das benutze:
Ok, jetzt funktioniert ... Popover-Eigenschaft in meinem Controller hinzufügen
quelle
Unter Swift 4 und iOS 11 war für mich die einzig mögliche Lösung. Zur Nutzung
showViewController:sender: and showDetailViewController:sender:
stattpresentViewController:animated:completion:
.Aus dem Apple Doc
quelle