【问题标题】:Screen rotation from device orientation and a new UIView设备方向的屏幕旋转和新的 UIView
【发布时间】:2012-05-03 16:55:14
【问题描述】:

当屏幕从纵向旋转到横向时,在视图堆栈顶部的应用程序 UIWindow 范围内放置新 UIView 的最安全和最有效的方法是什么? 另外,当从横向返回到纵向时,删除这个子视图。

基本上,应用程序的创建方式与大多数情况相同:

-UIWindow:

--UIView

---所有子视图(包括一个tabview控制器)

我想创建:

-UIWindow:

--UIView(新的,要放在上面)

--UIView

---所有子视图(并由此处的视图控制器触发)

这是错的吗?几乎没有文档可以帮助做到这一点。

【问题讨论】:

    标签: iphone objective-c rotation screen orientation


    【解决方案1】:

    如果您创建一个视图控制器来保存您的所有子视图,您只需使用将为您调用的旋转函数:

    willRotateToInterfaceOrientation:duration: 和 didRotateFromInterfaceOrientation:

    所以假设你使用 didRotateFromInterfaceOrientation 你检查

    if(UIInterfaceOrientationIsLandscape(orientation))
    {
        [yourView removeFromSuperView];
    }
    else
    {
        [self.view addSubView: yourView];
    }
    

    【讨论】:

    • 我会在应用程序结构的哪个位置执行此操作?应用委托?
    • 我从您最初的帖子中得知您想在视图控制器中执行此操作,因此您可以将此逻辑放在函数“willRotateToInterfaceOrientation”中,该函数是任何 UIViewController 的一部分。在上面的代码中,“self”指的是视图控制器。您可以在此处查看官方文档link 当您的应用在您身上旋转时将调用此函数,它会将您传递给您的方向,该方向将更改为您可以使用我的代码进行检查。
    • 好的,我明白你在说什么,但是因为应用程序使用 TabView,所以委托是创建 UITabViewController 并放置在第一个视图中的,即应用程序委托的“根视图控制器”。我这样说是因为我相信任何子视图都受到其父视图边界的限制。这是正确的吗?我实际上可以子视图全屏视图吗?
    • 我想我更了解你的问题是什么,因为我没有意识到你有一个标签栏。应用程序委托有一个功能 - (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation 看起来您可以在应用程序委托级别拦截,然后直接在应用程序的窗口上添加全屏视图(这也将覆盖标签栏),然后当它旋转出来时,您可以将其移除。
    • 那么就没有办法调用superview函数来处理了吗?
    【解决方案2】:

    在这里查看我的答案:https://stackoverflow.com/a/4960988/202451

    它应该让你更接近于做这样的自定义事情

    【讨论】:

      【解决方案3】:

      我找到了可行的解决方案。你能提供一个更好的吗?

          ArtsDayAppDelegate *appDelegate = (ArtsDayAppDelegate*)[[UIApplication sharedApplication] delegate];
          UIView *landscapeView;
      
          if (!landscapeView) {
              landscapeView = [[UIView alloc] initWithFrame: frame];
          }
      
          [landscapeView setBackgroundColor:[UIColor blackColor]];
          ..add various views..
          [appDelegate.window.rootViewController.view addSubview:landscapeView];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多