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
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
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.
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%
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.
Tags und Links objective-c screen-orientation uipopover