如何在Tabbar应用中将视图旋转为横向

时间:2009-02-10 21:59:03

标签: iphone ios cocoa-touch

我有一个基于tabbar的应用程序。

我在Interface Builder中构建了2个视图,一个是纵向视图,另一个是横向模式。

现在,我想要像iPod App这样的东西。我希望横向视图是全屏的,并隐藏tabbar&状态栏。

我的工作基础是:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration { 
    if (self.landscape) {
        if (toInterfaceOrientation == UIInterfaceOrientationPortrait)
        {
            self.view = self.portrait;
            self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(360));
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
        {
            self.view = self.landscape;
            self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
        {
            self.view = self.landscape;
            self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
        }
        else
        {
            self.view = self.portrait;
            self.view.transform =  CGAffineTransformMakeRotation(degreesToRadian(-180));
        }
    }
}

但所有工作都很混乱。横向视图未正确填充区域,控件位于错误的位置,与首先设置的不同。

另外,我还没有办法隐藏其他一切......

5 个答案:

答案 0 :(得分:5)

查看Apple的“AlternateViews”示例代码。

基本思想是您可以通过通知检测设备的物理方向,然后“模态”激活新的视图控制器并让它请求全屏。您可以通过使用shouldAutorotate来禁用界面旋转...仅针对一个方向返回YES,因为您通过通知手动执行所有操作。当您更改物理方向时,您的模态视图控制器将被显示或关闭。

答案 1 :(得分:2)

您可以通过调用

隐藏状态栏
setStatusBarHidden:(BOOL)

在UIApplication引用上,如此。

- (void)applicationDidFinishLaunching:(UIApplication *)application {

[application setStatusBarHidden:YES];

}

要删除标签栏,您可以在“界面”构建器中为您的代码创建一个引用插座并调用

[myUITabBar removeFromSuperview];

这可能有用,虽然我没有测试过,但对于其他问题,我不是百分之百,没有解决过这些问题。

答案 2 :(得分:1)

好的,这就是我把这个用于工作:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration {
    if (self.landscape) {
        if (toInterfaceOrientation == UIInterfaceOrientationPortrait)
        {
            self.view = self.portrait;
            //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(360));
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
        {
            self.view = self.landscape;
            //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
        }
        else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
        {
            self.view = self.landscape;
            //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
        }
        else
        {
            self.view = self.portrait;
            //self.view.transform =  CGAffineTransformMakeRotation(degreesToRadian(-180));
        }
    }
}

现在,在AppDelegate中:

- (void) didRotate:(NSNotification *)notification
{   
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    [UIView beginAnimations:nil context:NULL];  

    if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight)
    {
        [tabBarController.view setAlpha:0.0];
        [tabBarController.view removeFromSuperview];

        [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
    } else {
        [tabBarController.view setAlpha:1.0];
        [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];      
    }
    [UIView commitAnimations];  
}

但是如何设置当前视图以及如何恢复tabbar?

答案 3 :(得分:1)

当我查看iPod应用程序时,在我看来,TabBarController视图不会以任何方式被替换或修改。我认为tabbarcontroller视图和coverflow视图之间只有一个淡入淡出过渡。

如果我是你,我会尝试(不确定这是否可行)使用coverflow控制器,其视图显示在tabBarController的视图之上。如果会阻止tabBarController自动旋转它的视图,但在那一刻我会淡出它的视图并淡入封面流视图,这只是风景。

我不知道statusBar是否会有正确的行为,我会为你提供很多详细信息,但无论如何我觉得拥有两个独立的控制器是个好主意,一个显示在风景中,另一个(tabBar)是纵向的。

希望能帮助你。

答案 4 :(得分:1)

似乎有相当数量的编码员希望有一个标签栏项目将他们带到全屏横向视图(没有状态栏,没有标签栏),然后再回来。

我已经在Apple开发者论坛上发布了关于这是否确实可行的调查,但还没有回复。

为什么这么难? (对不起,一个新手问题?似乎一些相当明显的事情应该不会很难)我在网上找到的任何人都没有明确答案。