UIDavigationController推送后[UIDevice currentDevice] .orientation == UIDeviceOrientationUnknown

时间:2011-12-13 08:04:47

标签: iphone uinavigationcontroller uiinterfaceorientation uideviceorientation

这是一个观察,而不是任何事情,因为我似乎找到了解决方法......

当它位于已被推送到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.
}

......每次都有效。

仍然,我不明白为什么第一个变体在推送视图控制器的上下文中不起作用。想法有人吗?这只是一个错误吗?

1 个答案:

答案 0 :(得分:3)

我可以在这里想到几件事,但我不确定它们是你想要的......

首先,启动应用时,出于性能原因,设备方向通常会返回UIDeviceOrientationUnknown。您可以尝试的一件事是使用正确的自动调整选项在.nib或Storyboard中布置子视图,并让iOS完成它的工作。

其次,如果你像我一样,也许你正在测试一台放在电脑旁边的设备,放在桌子上。那么,在这种情况下,你将获得UIDeviceOrientationUnknown的东西。你应该测试UIDeviceOrientationIsValidInterfaceOrientation([[UIDevice currentDevice] orientation])。例如,如果设备背面放下,则会向该语句返回yes。这也意味着当您使用UIInterfaceOrientationIsLandscape(orientation)时,您会因错误的原因得到正确的结果。 UIInterfaceOrientationIsLandscape返回false不是因为设备的方向是UIDeviceOrientationPortrait,而是因为它无效。

不确定这是否有帮助,但我花了一段时间才弄明白,我认为分享这些信息会很好! :)