IOS8 wie man ein aktives Popover bewegt

8

Ich habe eine App für iOS7 entwickelt und versuche nun, sie für iOS8 zu aktualisieren. Problem, das ich habe, ist folgendes:

Die Ausrichtung des App-Bildschirms kann gedreht werden und einige Tasten bewegen sich in einigen Fällen drastisch. Ich habe ein paar Popovers, die auf diese Tasten zeigen. Wenn also ein Popover geöffnet ist, wenn sich der Bildschirm dreht, bewegt sich die Taste, ich brauche auch das Popover.

In iOS7 habe ich Folgendes getan: Wenn der Bildschirm gedreht wurde, aktualisierte ich die Einschränkungen

%Vor%

Ich bewege auch das Popover

%Vor%

Ich lade zuerst das Popover

%Vor%

[self ExamplePopoverPosition] gibt nur die Tastenposition zurück.

Das alles hat gut funktioniert, ich war glücklich, iPad war glücklich und alle verhielten sich.

Jetzt wegen iOS8 muss ich ein paar Bits ändern.

self.interfaceOrientation wird abgeschrieben

[examplePopoverController presentPopoverFromRect:[self ExamplePopoverPosition] inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

in didRotateFromInterfaceOrientation gibt einen Fehler aus

"Application tried to represent an active popover presentation: <UIPopoverPresentationController: 0x7bf59280>"

Ich habe es geschafft, self.interfaceOrientation durch

zu korrigieren %Vor%

Aber ich habe keine Ahnung, wie ich das Popover-Problem lösen kann. Ich habe es versucht

%Vor%

aber kann einfach nicht scheinen, um es zur Arbeit zu bringen.

Kann jemand raten

Danke

    
Display Name 04.10.2014, 08:06
quelle

4 Antworten

4

In iOS 8 können Sie - viewWillTransitionToSize: withTransitionCoordinator: um Änderungen der Bildschirmgröße (und -ausrichtung) zu berücksichtigen:

%Vor%

Wenn Sie diese Methode implementieren, werden die veralteten Rotationsmethoden wie willAnimateRotationToInterfaceOrientation: nicht aufgerufen, wenn sie unter iOS 8 ausgeführt werden.

    
Darren 15.11.2014 19:39
quelle
1

Wenn Sie popoverController:willRepositionPopoverToRect:inView: verwenden, versuchen Sie beim Neuzuweisen des Parameters rect mit:

%Vor%

und nicht:

%Vor%

Stellen Sie außerdem sicher, dass Sie den Delegierten des Popover-Controllers korrekt zugewiesen haben.

    
tjf 15.11.2014 16:50
quelle
0

Zuerst müssen Sie das Popover bei der Rotation nicht verwerfen und präsentieren. UIPopoverPresentationController erledigt das für Sie. Sie müssen SourceView / sourceRect nicht einmal aktualisieren, wenn sie beim Erstellen des Popover-Objekts festgelegt wurden.

Nun, der Trick mit animate(alongsideTransition: ((UIViewControllerTransitionCoordinatorContext) -> Void)?, completion: ((UIViewControllerTransitionCoordinatorContext) -> Void)? = nil) ist, dass Sie Ihre Einschränkungen in alongsideTransition closure, nicht in completion aktualisieren sollten. Auf diese Weise stellen Sie sicher, dass UIPopoverPresentationController die aktualisierte sourceRect beim Wiederherstellen des Popover am Ende der Rotation hat.

Was kontraintuitiv erscheint, ist, dass Sie innerhalb von alongsideTransition closure bereits Ihr neues Layout haben, von dem Sie die Berechnung der Abhängigkeiten ableiten.

Hier ist ein Beispiel in Swift:

%Vor%
    
Mu-Sonic 15.10.2016 22:20
quelle
-1

Sehr interessant - ich habe es geschafft, ohne die Position manuell zu aktualisieren. Ich weiß nicht, warum das funktioniert.

%Vor%

Platzieren Sie die Schaltfläche, die das Popover darstellt, in einer "Containeransicht". Dann wird das Popover automatisch den Standort bei der Orientierungsänderung anpassen.

    
Jeffrey Sun 19.04.2015 15:24
quelle