1

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

谢谢。

4

2 回答 2

1

我在同样的问题上苦苦挣扎了一段时间,并想出了一个笨拙的解决方法。在我的解决方案之前,有关障碍的更多背景知识:

  • 在 iPhone OS 中,根视图的坐标始终位于物理屏幕的文字固定坐标中。“向上”始终是设备向上。子视图必须获取已转换为给定方向的坐标,以便“向上”是我们所期望的:重力向上。
  • 因此,将 UIView 放置在视图层次结构的顶部(在 UIScrollView 上方)将需要您在方向事件期间自己进行这些转换。你得到全屏,但你失去了滚动视图管理子视图的方向坐标的好处。
  • 将视图保持在滚动视图中,没有像 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];
    }       
}
}

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

于 2010-06-03T15:46:55.343 回答
1

I ended up using a modal view controller which I present from the split view controller. I then specify the allowed orientations in -shouldAutorotateToInterfaceOrientation. I also hide the status bar. This works for my needs.

于 2010-07-12T16:56:31.807 回答