2015-12-07 8 views

Antwort

6

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") 
    } 
} 
+0

Ja, ich habe es versucht. Das funktioniert. Aber ich möchte eine Benachrichtigung erhalten, wenn der Wechsel beendet ist. Trotzdem danke. – RayChen

+0

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

+0

Nein, ich habe nicht überprüft, dass – RayChen

0

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.

9

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) 
    }]; 
} 
+3

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

+0

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! –

+0

TraitCollectionDidChange funktioniert gut für mich für iPad Multitasking. – malhal

2

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)

0

In-View-Controller, sollten wir nennen

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {

Benachrichtigung, wenn die Orientierung/Multi Window View ändert sich.

Verwandte Themen