禁用一个UITabbar项目的旋转

时间:2014-02-19 16:46:48

标签: uitabbarcontroller orientation landscape uitabbaritem portrait

我有一个带有4个标签栏项目的uitabbarcontroller,每个标签栏项目都有一个uinavigationcontroller。

我需要将一个uitabbar项目的方向仅锁定到Portrait。所以我实现了以下代码:

创建了一个自定义标签栏控制器,并在其中添加了以下代码:

MainTabBarController.m

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // You do not need this method if you are not supporting earlier iOS Versions
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

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

    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

创建了一个自定义导航控制器,用于其中一个uitabbaritems并在其中添加了以下代码:

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

-(BOOL)shouldAutorotate
{
    return YES;
}

对于自定义导航控制器中的uiviewcontroller,我添加了以下代码:

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

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

上面的代码工作正常。我的问题是,如果您转到tabbar项目(其方向被锁定到Protrait),当设备已处于横向模式时,方向将更改为横向。谁能帮助我如何解决我的问题。

谢谢, 阿南德。

1 个答案:

答案 0 :(得分:2)

FYI !!! 我找到了解决问题的方法。我将以下函数添加到viewcontroller,我只想在protrait模式下显示:

-(void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    if (UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
    {
        if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)])
        {
            int orientationPortrait = UIInterfaceOrientationPortrait;
            NSMethodSignature *sig = [[UIDevice currentDevice] methodSignatureForSelector:@selector(setOrientation:)];
            NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];
            [invo setTarget:[UIDevice currentDevice]];
            [invo setSelector:@selector(setOrientation:)];
            [invo setArgument:&orientationPortrait atIndex:2];
            [invo invoke];
        }
    }
}