2014-09-19 12 views
32

aufgerufen Da willAnimateRotationToInterfaceOrientation:duration:deprecated in iOS8 ist, muss viewWillTransitionToSize:withTransitionCoordinator:instead verwendet werden.iOS8 Schnittstelle Rotationsmethoden nicht

Diese Methode wird jedoch nicht in meinem View-Controller auf iOS8 aufgerufen. Gibt es noch etwas, das ich implementieren muss, damit dieser Callback funktioniert?

Ich kann nichts in der Dokumentation finden. Das einzige, was ich finden konnte, war, dass es zum neuen UIContentContainer Protokoll gehört. Aber selbst wenn ich dies explizit zu den Protokollen meines Controllers hinzufüge, funktioniert es nicht.

Irgendwelche Ideen?

+0

Ich habe meine ViewController als eine Ansicht für segmentierte Schaltflächen geladen. In diesem Fall habe ich viewWillTransitionToSize nicht erhalten: withTransitionCoordinator: called. Wie willst du den viewController laden? – Surendra

Antwort

37

Die viewWillTransitionToSize:withTransitionCoordinator: scheint nur zu funktionieren, wenn die Schnittstelle tatsächlich Größe ändern wird, was bedeutet, dass wir um 90 Grad gedreht haben. Wenn Sie eine Maske in Ihrem Layout haben, die nur Querformat zulässt, ändert sich bei einer Drehung um 180 Grad die Größe der Schnittstelle nicht, daher scheint diese Methode nicht aufgerufen zu werden.

Ich habe durch stattdessen Registrierung auf den UIDeviceOrientationDidChangeNotification Benachrichtigung, um diesen in meiner app gearbeitet wie:

(Aus meiner Sicht Controller viewWillAppear):

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil]; 
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

(Ein in meinem viewWillDisappear [erinnert abmelden]

)
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; 

Mein deviceOrientationDidChange: wie folgt aussieht:

- (void)deviceOrientationDidChange:(NSNotification *)notification { 
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    [self willRotateToInterfaceOrientation:orientation duration:1.0]; 
} 
+0

diese Workaround auch für mich funktioniert und scheint die beste Erklärung bisher – tschubotz

+0

hat für mich gearbeitet, um Rotation Problem mit iOS8 .. zu lösen! viele thnx –

+26

Was für eine lächerliche Entwertung von Apple .. – Sti

33

Gemäß der docs, erinnern super

- (void)viewWillTransitionToSize:(CGSize)size 
     withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    // ... 
} 

Ansonsten Controller Kind Ansicht aufrufen wird die Nachricht an sie nicht bekommen weitergeleitet.

+0

Während dies ein nützlicher Vorschlag ist, vermisse ich vielleicht, wie dies die ursprüngliche Frage beantwortet ...? – yura

+0

Vielen Dank, In meinem Fall: Ich vermisse Anruf hinzufügen childViewController. : D –

+0

@yura Wenn eine andere Klasse die Nachricht empfängt und sie nicht mit einem Aufruf an super weitergibt, erhält die Klasse, an der Sie gerade arbeiten, diese Nachricht möglicherweise nicht. – arlomedia

7

Ich weiß, dass diese Frage an diesem Punkt ein bisschen alt ist, aber ich denke, dass das Problem für einige, die darüber stoßen können, vielleicht anders gelöst wird. Wenn Sie versuchen, eine Ansicht zu laden, die Teil eines VERSCHIEDENEN Controllers ist, indem Sie addSubview(controller.view) verwenden, müssen Sie diesen Controller auch dem übergeordneten Element hinzufügen (möglicherweise die Ansicht, die Sie dem Controller hinzufügen). Wenn Sie den Controller nicht zu einem übergeordneten Element hinzufügen, erhalten Sie nie die Aktualisierungen für Größenänderungen. Wir haben später den Grund für Apples API-Änderung herausgefunden; Mit dem iPad Pro kann Ihre SizeClass ohne Rotation mit der Multitasking-Fähigkeit wechseln. Dies ruft auch die Methode:

viewWillTransitionToSize(size: CGSize, 
     withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 

In der übergeordneten Klasse, wenn Sie die obige Methode außer Kraft setzen, stellen Sie sicher, dass Sie Super auch anrufen oder Sie gerade einen anderen Weg finden Sie Ihren Kopf gegen eine Wand zu schlagen ...

+0

Super ... mein Problem behoben. Ich rief NICHT super an, und diese Methode wurde nicht aufgerufen. Habe angefangen, Super zu rufen, und pow ... fing an zu arbeiten. –

+0

+1 für: - Wenn Sie versuchen, eine Ansicht zu laden, die Teil eines VERSCHIEDENEN Controllers ist, indem Sie addSubview (controller.view) verwenden, müssen Sie diesen Controller auch dem übergeordneten Element hinzufügen (möglicherweise die Ansicht, die Sie hinzufügen) Regler). Wenn Sie den Controller nicht zu einem übergeordneten Element hinzufügen, erhalten Sie nie die Aktualisierungen für Größenänderungen. – paran

+0

Vielen Dank dafür !. Ich habe nicht bemerkt, dass in meiner Elternansicht (für die meisten meiner App) ich nicht super darauf ansprach, daher keine der untergeordneten Ansichten, wo diese Methoden ausgeführt wurden. –

Verwandte Themen