iOS UIInterfaceOrientation和UIDeviceOrientaion问题

时间:2013-09-20 06:32:44

标签: iphone ios uitabbarcontroller uiinterfaceorientation uideviceorientation

我有一个应用程序,其中标签栏控制器有3个标签,每个标签都有一个视图控制器。 视图控制器1和2仅支持纵向模式,但选项卡3中的视图控制器支持所有方向 - 横向,横向左侧,横向右侧和纵向上下颠倒。 对于选项卡3,我们必须在设备处于纵向模式时显示特定视图,而在设备处于横向模式时显示另一个视图。

如果设备处于纵向模式且用户单击选项卡3,则在纵向模式下正确加载视图,然后如果我们将设备旋转到横向模式,则正确加载横向视图。

但是我们在标签1中将设备转为横向模式,然后单击标签3,然后出现问题,然后显示屏幕以横向模式显示,但它将其显示为纵向视图。 / p>

当我试图通过NSLogging

在委托方法中找出原因时
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

interfaceOrientation的值为1,即UIInterfaceOrientationPortrait 并且控件进入为纵向模式写入的if条件

if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){

当我尝试在同一委托方法中打印UIDevice方向的值时

UIDeviceOrientation interfaceOrientation = [UIDevice currentDevice].orientation;
NSLog(@" device orientation %u", interfaceOrientation);

控制台中打印的值为4,即UIDeviceOrientationLandscapeRight。

因此界面方向是UIInterfaceOrientationPortrait,但设备方向是UIDeviceOrientationLandscapeRight。

还有一件事,现在如果我将设备旋转到纵向模式,然后移动到横向模式,则会显示正确的横向视图,并且应用程序开始正常运行。

所以问题是如果我在横向模式下加载标签3它无法正确加载 但如果我们进入纵向模式,然后旋转到横向,如果从那里工作正常。

如果有人能提出一些有用的建议,为什么这样的行为会非常有益。

由于

2 个答案:

答案 0 :(得分:1)

将这些行添加到Tab1& viewWillAppear方法中的Tab2,

#import <objc/message.h>

- (void)viewWillAppear:(BOOL)animated {
    if(UIDeviceOrientationIsLandscape(self.interfaceOrientation)){
        if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
            objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationPortrait );
        }
    }
}

答案 1 :(得分:0)

使用UITabBarController的子类创建CustomTabBarController类(例如:CustomTabBarController)

@interface CustomTabBarController : UITabBarController

将以下行添加到此类:

- (BOOL)shouldAutorotate
{
    return [self.selectedViewController shouldAutorotate];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.selectedViewController supportedInterfaceOrientations];
}

在你的app delegate或初始化UITabBarController的地方,用CustomTabBarController实例替换这些实例。

self.tabBarController = [[[CustomTabBarController alloc] init] autorelease];

使用不同的视图控制器支持将线条添加到模型视图控制器:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate {
    return NO;
}