7

這是一個觀察比什麼都重要,因爲我似乎有一個變通發現...[的UIDevice currentDevice] .orientation == UIDeviceOrientationUnknown以下的UINavigationController推動

下面的代碼無法工作當它在一個已被推入UINavigationController堆棧的控制器。在這種情況下,[UIDevice currentDevice].orientation始終返回UIDeviceOrientationUnknown

-(void)layoutAccordingToOrientation { 
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation; 
    NSLog(@"layoutAccordingToOrientation/orientation==%i", orientation); 
    if (UIInterfaceOrientationIsLandscape(orientation)) { 
     : 
     _detailToolbar.frame = CGRectMake(0, 660, 1024, 44); 
    } else { 
     : 
     _detailToolbar.frame = CGRectMake(0, 916, 768, 44); 
    } 
} 

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self layoutAccordingToOrientation]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

以下調用已取得:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

若要解決此UIDeviceOrientationUnknown - 問題,我現在用下面的代替:

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
if (UIInterfaceOrientationIsLandscape(orientation)) { 
    etc. 
} else { 
    etc. 
} 

...它的工作原理每次。

不過,我不明白爲什麼第一個變體在推送視圖控制器的上下文中不起作用。想法任何人?它只是一個錯誤?

+0

我有同樣的問題,但是我無法讓你的工作在我的情況下工作。 – Flea

回答

3

我能想到幾件事情在這裏的,但我不知道他們是你在找什麼...

首先,當應用程序啓動時,通常設備的方向返回UIDeviceOrientationUnknown出於性能原因。你可以嘗試的一件事是用.nib或Storyboard中的子視圖進行佈局,並使用正確的自動調整選項,並讓iOS完成它的工作。其次,如果你像我一樣,也許你正在測試你的電腦旁邊的設備,放在桌子上。那麼,在這種情況下,你是而不是去得到UIDeviceOrientationUnknown的事情。您應該實際測試UIDeviceOrientationIsValidInterfaceOrientation([[UIDevice currentDevice] orientation])。例如,如果設備放在背面,則返回該語句的結果。這也意味着當你使用UIInterfaceOrientationIsLandscape(orientation)時,你會因錯誤的原因獲得正確的結果。 UIInterfaceOrientationIsLandscape返回false不是因爲設備的方向是UIDeviceOrientationPortrait,而是因爲它是無效的。

不太確定這是否有幫助,但我花了一段時間才弄清楚,我認爲這將是很高興分享這個信息! :)

相關問題