代码之家  ›  专栏  ›  技术社区  ›  Matt Long

全屏推荐方式

  •  1
  • Matt Long  · 技术社区  · 14 年前

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

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  1
  •   SG1    14 年前

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

    • 在iPhone操作系统中,根视图的坐标始终在物理屏幕的文字固定坐标中。”“向上”总是设备向上。子视图必须得到转换为给定方向的坐标,这样“向上”就是我们期望的:重力向上。
    • 因此,将uiview放置在视图层次结构的顶部(uiscrollview上方)需要在方向事件期间自己进行这些转换。你得到了全屏,但是你失去了滚动视图管理子视图方向坐标的好处。
    • 将视图保持在滚动视图中,并不像在Mac OS中那样简单地折叠分割视图的窗格。查看头文件会显示一些用于管理宽度的私有实例方法。

    所以,我认为你能做的就是维护两个“方向感知”视图控制器(一个SplitView,一个FullScreen),当你切换到全屏时,将它们切换出去,并在它们之间移动你的视图。我没有走这条路,因为这显然是一个敏感的情况记忆-和视图层次-明智的。

    我要做的是在主视图的“几乎全屏”宽度和常规拆分宽度之间切换。除了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];
        }       
    }
    }
    

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

        2
  •  1
  •   Matt Long    14 年前

    最后我使用了一个模态视图控制器,它是我从分割视图控制器中展示的。然后在-shouldautorotatepointerfaceorientation中指定允许的方向。我还隐藏了状态栏。这符合我的需要。