推荐的全屏幕方式

时间:2010-06-02 20:14:47

标签: iphone ipad uiview uiwindow

我希望有一个UIView接管整个屏幕以不时显示图像,但大多数时候我使用UISplitViewController作为主应用程序功能。有没有推荐/最佳实践方法来做到这一点?现在,我有一个指向主窗口的指针,我只是将UIView添加为子视图并将其置于前面,但它不会以正确的方向显示。我只是想知道是否有一种更好的方法/简单的东西我不知道。

感谢。

2 个答案:

答案 0 :(得分:1)

我在同一个问题上挣扎了一段时间,并提出了一个笨重的解决方法。在我的解决方案之前,还有一些关于障碍的背景知识:

  • 在iPhone OS中,根视图的坐标始终位于物理屏幕的文字固定坐标中。 “Up”始终是设备。子视图必须获得已转换为给定方向的坐标,以便“向上”是我们期望的:引力向上。
  • 因此,在视图层次结构的顶部(UIScrollView上方)放置UIView将要求您在定向事件期间自行进行这些转换。您获得了全屏,但是您失去了scrollView管理子视图的方向坐标的好处。
  • 在scrollView中保持您的视图,在Mac OS中没有简单的方法可以简单地折叠splitView的窗格。查看头文件会显示一些用于管理宽度的私有实例方法。

所以,我认为您可以做的是维护两个“方向感知”视图控制器(一个splitView,一个全屏),并在切换全屏时切换它们并在它们之间移动视图。我没有走这条路,因为它显然是一个敏感的情境记忆和视图层次结构。

我所做的是在主视图的“几乎全屏”宽度和常规分割宽度之间切换。这很有效,只是splitView的圆角实际上是硬编码的图像,无论splitView的尺寸如何都可以绘制。您将在100%的时间内看到这些微小的黑色圆角。效果如下:

- (IBAction)toggleFullscreen:(id)sender; {
id appDelegate = [[UIApplication sharedApplication] delegate];
UISplitViewController *split = [appDelegate splitViewController];

//get master and detail view controller
UIViewController *master = [split.viewControllers objectAtIndex:0];
UIViewController *detail = [split.viewControllers objectAtIndex:1];

//In landscape permit fullscreen
if(self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
   self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
    CGRect f = detail.view.frame;
    if ( f.origin.x == 0 ) { //exiting fullscreen
        [sender setImage:[UIImage imageNamed:@"SlideLeft.png"]];
        //adjust detail view
            f.size.width = 703;
            f.origin.x = 321;
        [detail.view setFrame:f];

        //adjust master view
            f = master.view.frame;
            f.size.width = 320;
            f.origin.x = 0;
        [master.view setFrame:f];       

    } else { //entering fullscreen
        [sender setImage:[UIImage imageNamed:@"SlideRight.png"]];
        //adjust detail view
            f.size.width = 1024;
            f.origin.x = 0;     
        [detail.view setFrame:f];

        //adjust master view
        f = master.view.frame;
            f.size.width = 1;
            f.origin.x = -1;
        [master.view setFrame:f];
    }       
}
}

我从这里和其他来源获得了大量此代码,但据我所知,这种实现是独一无二的。可能是因为它不完美。

答案 1 :(得分:1)

我最终使用了一个模态视图控制器,它是我从拆分视图控制器中提供的。然后,我在-shouldAutorotateToInterfaceOrientation中指定允许的方向。我也隐藏了状态栏。这符合我的需要。