禁用一个 UITabbar 项目的旋转

Posted

技术标签:

【中文标题】禁用一个 UITabbar 项目的旋转【英文标题】:Disable rotation for one UITabbar item 【发布时间】:2014-02-19 16:46:47 【问题描述】:

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

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

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

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;

上面的代码工作正常。我的问题是,如果您在设备已经处于横向模式时转到选项卡栏项(其方​​向锁定为 Protrait),则方向将更改为横向。谁能帮我解决我的问题。

谢谢, 阿南德。

【问题讨论】:

【参考方案1】:

仅供参考!!! 我找到了解决我的问题的方法。我在视图控制器中添加了以下功能,我希望仅在纵向模式下显示:

-(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];
        
    

【讨论】:

我看到从纵向变为横向时有一个小动画。有没有办法将此动画设置为 NO? @justME 抱歉,我不知道如何将该动画设置为 NO。如果你发现了,请告诉我。 这不是一个很好的解决方案,视图仍然会旋转,但会翻转回纵向。

以上是关于禁用一个 UITabbar 项目的旋转的主要内容,如果未能解决你的问题,请参考以下文章

iOS didSelectTabBarItem 知道之前选择了啥项目

仅自动旋转 UITabBar 内的一些选项卡? (iOS 5)

ios4+的UITabBar自动旋转

UITabBar 内的单个 UIViewController 自动旋转

ios标签栏点击显示模态视图黑屏

当项目设置允许所有旋转时禁用特定视图控制器中的旋转