【问题标题】:Recommended Way To Go Full Screen推荐的全屏方式
【发布时间】:2010-06-02 20:14:47
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: iphone ipad uiview uiwindow


    【解决方案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];
        }       
    }
    }
    

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

    【讨论】:

    • 感谢您对此的反馈。我实际上做过类似的事情。我只是希望有一种更简单(更少代码)的方式来实现它。你看过 UIViewController 上的 -setWantsFullScreenLayout 吗?那里似乎有一些东西,但是当我使用它时,尽管我是横向的,但由于视图以纵向显示,所以仍然有些混乱。这很烦人,但我确定我做错了。 ;-)
    • 根据我的阅读,该方法仅影响黑色状态栏是否显示。 “想要全屏”是用词不当;它应该被称为“显示状态栏”。
    【解决方案2】:

    我最终使用了从拆分视图控制器中呈现的模态视图控制器。然后我在 -shouldAutorotateToInterfaceOrientation 中指定允许的方向。我也隐藏了状态栏。这可以满足我的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 2020-01-08
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多