Ich arbeite an einem Adapt Multitasking Split-Ansicht für App zu unterstützen. Aber ich finde das Merkmal collectionDidChange nicht aufgerufen, wenn die App auf der rechten Seite ist. Hat jemand eine Idee dazu?TraitCollectionDidChange nicht aufgerufen, wenn Multitasking
Antwort
Haben Sie die viewWillTransitionToSize-Methode ausprobiert? Dies wird verwendet, um den Container darüber zu informieren, dass sich die Größe seiner Ansicht ändern wird.
Objective-C
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
Swift
func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animateAlongsideTransition(nil, completion: {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("landscape")
} else {
print("portrait")
}
}
Per Dokumentation von UITraitEnvironment:
Das System ruft diese Methode auf, wenn die Schnittstellenumgebung ändert iOS. Implementieren Sie diese Methode in Ansichtscontrollern und Ansichten entsprechend den Anforderungen Ihrer App, um auf solche Änderungen zu reagieren. Sie können beispielsweise das Layout der Unteransichten eines View-Controllers anpassen, wenn ein iPhone von Hochformat auf Querformat gedreht wird. Die Standardimplementierung dieser Methode ist leer. Rufen Sie zu Beginn Ihrer Implementierung super auf, um sicherzustellen, dass in der Ansichtshierarchie höhere Schnittstellenelemente die Möglichkeit haben, ihr Layout zuerst anzupassen.
Sie können traitCollectionDidChange
in Ihrem ViewController
überschreiben.
Jedoch.
traitCollectionDidChange
aufgerufen, wenn Sie von einem Split-View-Modus zu einem anderen wechseln. Zum Beispiel von 50/50 bis 33/66. Es so NICHT aufgerufen, wenn Sie Multitasking-Modus eingeben oder beenden.
Wenn benötigen Sie alle Veranstaltungen einschließlich Ein- und Aussteigen Multitasking-Modus umgehen, verwenden Sie viewWillTransitionToSize:withTransitionCoordinator:
statt:
// put this in your ViewController code
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// TODO: put your code here (runs BEFORE transition complete)
}
Wenn Sie Ihren Code NACH den Übergang compelete genannt werden sollen:
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
// TODO: put your code here (runs AFTER transition complete)
}];
}
Nur ein Hinweis für diejenigen, die das lesen. 'traitCollectionDidChange' wird nicht immer aufgerufen, wenn Sie den Split-Modus ändern, wie Sie es von" 50/50 view to 33/66 "sagten. Es wird nur aufgerufen, wenn die tatsächliche Größenklasse geändert wird. Z.B. Wenn Sie ein iPad und nicht ein iPad Pro haben und Ihre App von rechts erscheint, wird traitCollectionDidChange nicht aufgerufen, da eine Größenklasse in beiden Modi "Kompakt" ist. –
Vielen Dank für diesen Kommentar! Nur Apple kann eine einfache Sache (Umgang mit Ansichtsgröße Änderung in diesem Fall) so kompliziert und unklar machen! –
TraitCollectionDidChange funktioniert gut für mich für iPad Multitasking. – malhal
Wenn noch jemand daran zweifelt, ist das der Punkt:
// This method called every time user changes separator position or when user rotates device
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
// Always call super in those methods
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// Before this call your layout is old, status bar orientation will return value before rotation
[coordinator animateAlongsideTransition:^(id <UIViewControllerTransitionCoordinatorContext> context) {
// Code here will be executed during transform. Status bar orientation is new, your view size already changed (in general).
// Setup required animations or custom views transitions
}
completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
// Split view transition complete or device rotated
}];
}
Auch gibt es eine Methode traitCollectionDidChange:
, aber es wird nur aufgerufen, wenn horizontale Größenklasse tatsächlich geändert wird. Wenn Ihre App beispielsweise von der rechten Seite im geteilten Ansichtsmodus angezeigt wird, wird traitCollectionDidChange:
nicht aufgerufen, wenn der Benutzer die Trennposition geändert hat. Aber wenn Sie Ihre App von links präsentiert, wird es immer im Portrait-Modus aufgerufen werden, und in der Landschaft für Übergänge (50/50) <-> (66/33)
In-View-Controller, sollten wir nennen
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
Benachrichtigung, wenn die Orientierung/Multi Window View ändert sich.
- 1. TraitCollectionDidChange: Auch wenn ich keine Änderungen habe
- 2. Reorganisation von Symbolleiste und Navigationsleiste nach TraitCollectionDidChange
- 3. Multitasking Ausgabe
- 4. MPMoviePlayerController Multitasking-Problem
- 5. iphone MultiTasking?
- 6. Multitasking auf einer Webseite
- 7. Kooperatives Multitasking mit TPL
- 8. Multitasking mit Git
- 9. Multitasking mit Freertos in STM32F4x funktioniert nicht
- 10. Multitasking mit Glide
- 11. Multitasking mit setjmp, longjmp
- 12. collectionView nil, wenn [self.collectionView reloadData] aufgerufen wird, reloadData nicht aufgerufen
- 13. iOS: Erkennen, wenn die Multitasking-Leiste geöffnet wurde
- 14. NSURLConnection und Multitasking in iOS
- 15. Setter nicht aufgerufen, wenn Deserialisieren Sammlung
- 16. ioctl wird nicht aufgerufen, wenn cmd = 2
- 17. onClick Funktion funktioniert nicht, wenn sie aufgerufen
- 18. C++ Multithreading-Ausnahme, wenn nicht aufgerufen Thread.join()
- 19. Child statischer Konstruktor nicht aufgerufen, wenn Basiselement
- 20. Java SessionDestroyed nicht aufgerufen, wenn Sitzung
- 21. onHTTPRequest() wird nicht aufgerufen, wenn Wowza Server
- 22. didDeselectAnnotationView nicht aufgerufen, wenn auf Kartenansicht tippen
- 23. jqGrid benutzerdefinierte unformat nicht aufgerufen, wenn getrowdata()
- 24. MPMoviePlayerPlaybackDidFinishNotification wird aufgerufen, wenn es nicht
- 25. Array.sort funktioniert nicht richtig, wenn zweimal aufgerufen?
- 26. make app ohne Multitasking-Unterstützung
- 27. Multitasking und Multithreading in silverlight
- 28. Warum wird Multitasking auf dem iPhone nicht unterstützt?
- 29. Fragment Oncreateview() nicht aufgerufen, wenn wir die Registerkarten nicht wischen
- 30. Wenn Konstruktor aufgerufen wird und wenn Operatorfunktion
Ja, ich habe es versucht. Das funktioniert. Aber ich möchte eine Benachrichtigung erhalten, wenn der Wechsel beendet ist. Trotzdem danke. – RayChen
Haben Sie diesen Check dort in UIDevice.currentDevice(). Orientation.isLandscape.boolValue hinzugefügt, erhalten Sie den aktuellen Orientierungsstatus. Ich habe den Code mit einem Beispiel aktualisiert. –
Nein, ich habe nicht überprüft, dass – RayChen