2014-09-19 71 views
32

由於willAnimateRotationToInterfaceOrientation:duration:deprecated在iOS8中,需要使用viewWillTransitionToSize:withTransitionCoordinator:insteadiOS8接口旋轉方法不叫

但是,這種方法不會在iOS8的我的視圖控制器中調用。 還有什麼,我需要執行,爲了這個回調工作?

我在文檔中找不到任何東西。我唯一能找到的就是它屬於新的UIContentContainer協議。但是,即使我明確地將其添加到我的控制器的協議中,它也不起作用。

任何想法?

+0

我加載我的viewController作爲分段按鈕的視圖。在這種情況下,我沒有得到viewWillTransitionToSize:withTransitionCoordinator:被調用。你如何加載viewController? – Surendra 2014-10-07 22:10:09

回答

37

viewWillTransitionToSize:withTransitionCoordinator:似乎只有在界面實際上會改變大小,這意味着我們已經旋轉了90度。如果您的佈局上只有一個遮罩,只允許橫向旋轉180度,則界面大小不會更改,因此此方法似乎未被調用。

我圍繞着這一在我的應用程序通過,而不是註冊到工作的UIDeviceOrientationDidChangeNotification通知,如:

(在我的視圖控制器的viewWillAppear):

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

(一個在我viewWillDisappear [記得要退訂] )

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

deviceOrientationDidChange:樣子:

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

這個解決方法也爲我工作,似乎迄今爲止最好的解釋 – tschubotz 2014-10-09 19:52:02

+0

爲我解決旋轉問題與iOS8 ..!許多thnx – 2014-10-14 11:25:33

+26

蘋果的一個荒謬的貶低.. – Sti 2015-04-13 12:25:49

33

按照該docs,記得打電話super

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

    // ... 
} 

否則子視圖控制器將不會得到消息轉發給他們。

+0

雖然這是一個有用的建議,但我可能會錯過這是如何回答原來的問題......? – yura 2015-07-16 15:34:46

+0

謝謝,在我的情況下:我想念添加childViewController。 :D – 2015-08-16 07:27:19

+0

@yura如果另一個班級正在接收該消息,並且沒有通過超級呼叫傳遞該消息,那麼您正在使用的班級可能不會收到該消息。 – arlomedia 2015-10-16 22:30:03

7

我知道這個問題在這一點上有點老,但我認爲這個問題可能會以一種不同的方式解決一些可能遇到它的人。如果您試圖通過使用addSubview(controller.view)加載屬於DIFFERENT控制器一部分的視圖,則還需要將該控制器添加到父級(也可能是要添加到控制器中的視圖)。如果您沒有將控制器添加到父級,您將永遠不會收到大小更改的更新。我們後來發現了蘋果API改變的原因;藉助iPad Pro,您的SizeClass可以在不需要旋轉的情況下進行多任務處理。這也將調用方法:

viewWillTransitionToSize(size: CGSize, 
     withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 

在父類,如果重寫上面的方法,一定要調用super一樣好,甚至你只是找到另一種方式來打你的頭撞牆......

+0

太棒了...解決了我的問題。我沒有叫超級,這種方法沒有被調用。開始叫超級,pow ...開始工作。 – 2016-06-02 16:35:40

+0

+1: - 如果您試圖通過使用addSubview(controller.view)加載屬於DIFFERENT控制器一部分的視圖,則還需要將該控制器添加到父級(也可能是您添加的視圖的控制器)。如果您沒有將控制器添加到父級,您將永遠不會收到大小更改的更新。 – paran 2017-08-14 10:53:44

+0

非常感謝!我沒有注意到,在我的父視圖中(對於我的大部分應用程序),我沒有對它進行超級調用,因此沒有執行這些方法的子視圖。 – 2017-09-26 23:59:35