【问题标题】:iPhone/iPad - switching Views cause orientation problemsiPhone/iPad - 切换视图导致方向问题
【发布时间】:2010-09-27 20:17:08
【问题描述】:

我正在开发一个通用的 iPhone/iPad 应用程序。我正在使用 MonoTouch,但我可以在 Obj-C 中获取答案(我应该能够破译它,而且 MonoTouch 的 UIKit 大部分是 1 比 1)。

基本上我的应用有 2 个视图:一个“登录”视图和一个“登录”视图。

在应用启动时,我的登录视图是主 UIWindow 的唯一子视图。登录后,我在登录视图和 UIWindow.AddSubView 上调用 RemoveFromSuperview 来添加登录视图。所有这些都很好用,而且方向也很有效,我回复了 ShouldAutorotateToInterfaceOrientation。

在您注销之前,所有方向都开始上升。在定向时,该应用程序会定向状态栏,但不会影响我的视图。最重要的是,在 iPad 上,我的 UISplitView 的行为非常奇怪,我的主视图以一种方式面向,而细节视图则以另一种方式。

在 UIWindow 中切换视图的正确方法是什么?我觉得方向应该自动工作,因此我做错了。

更新:

这是一个代码 sn-p(在 C# 中,但你明白了):

_loginController.View.RemoveFromSuperView();
_window.AddSubView(_loggedInController.View);

反过来:

_loggedInController.View.RemoveFromSuperView();
_window.AddSubView(_loginController.View);

相当简单,对吧?

更新 2:

我做了一个简单的复制——甚至包括一个 UISplitViewController,它工作得很好。

我的应用程序中一定有特定的东西导致了这种奇怪的行为。

【问题讨论】:

    标签: iphone objective-c orientation xamarin.ios


    【解决方案1】:

    如果我理解正确,您可以在加载新视图之前检查视图方向。我想我做了几乎相同的事情。尝试做这样的事情:

    CGRect frame = [[UIScreen mainScreen] applicationFrame];
    
        switch(splitViewController.interfaceOrientation){
            case UIInterfaceOrientationPortrait:
            case UIInterfaceOrientationPortraitUpsideDown:
                [splitViewController.view setFrame:frame];
                break;
            case UIInterfaceOrientationLandscapeLeft:
            case UIInterfaceOrientationLandscapeRight:
                [splitViewController.view setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.height, frame.size.width)];
                break;
        }
    

    基本获取当前应用框架并手动定位。 splitViewController 中有一个错误,如果在执行 applicationDidFinishLaunching 方法后显示它,将不会检查方向。

    【讨论】:

    • 我的登录视图没有拆分视图,为什么会出现这个问题?这是一个非常标准的视图,带有用户名/密码和一个按钮。无论哪种方式,我都会试一试。
    • 这导致了类似的奇怪问题,我已经在 ViewDidAppear 上的 UISplitViewController 中进行了这种定向工作。我将尝试使用测试应用程序重现此内容,并将其发布在这里。
    【解决方案2】:

    好的,我明白了,我有一个类似的应用程序,但只是以不同的方式解决了这个问题。

    我在 appDidFinishLaunching 方法中创建并初始化了 splitViewController 并将其传递到我的登录屏幕。

     theLoginScreen = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:[NSBundle mainBundle]];
        theLoginScreen.splitViewController = splitViewController;
        theLoginScreen.detailViewController = detailViewController;
        theLoginScreen.rootViewController = rootViewController;
        theLoginScreen.appDelegate = self;
    
        [window addSubview:theLoginScreen.view];
    

    从这里我做了登录的东西,然后做了这样的事情:

    [self.view removeFromSuperview];
    
        CGRect frame = [[UIScreen mainScreen] applicationFrame];
    
        switch(splitViewController.interfaceOrientation){
            case UIInterfaceOrientationPortrait:
            case UIInterfaceOrientationPortraitUpsideDown:
                [splitViewController.view setFrame:frame];
                break;
            case UIInterfaceOrientationLandscapeLeft:
            case UIInterfaceOrientationLandscapeRight:
                [splitViewController.view setFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.height, frame.size.width)];
                break;
        }
    
        [appDelegate.window addSubview:splitViewController.view];
    

    试一试类似的方法,看看是否可行。 :)

    【讨论】:

    • 与其他答案没有任何不同。同样,我将制作一个最简单的项目来复制问题,因为我相信 UISplitViewController 可能会导致问题。
    • 好的。您的 splitview 加载奇怪(rv 正确,dv 错误)应该由上面的代码修复。我有同样的问题,并且解决了它。其次,您是否曾经以模态方式显示任何内容?我以前这样做过,它导致了您描述的那种状态栏旋转/视图卡住问题。
    • 这与我如何显示模态视图有关。超级视图没有旋转,所以模态视图也被卡住了。
    • 是的,我没有使用模态视图显示任何内容。我已经重新开始了我的项目,到目前为止,新项目没有问题。 (无论如何我都会这样做以清理所有内容)我还有一个奇怪的事情是 UISplitViewController 中的 UITabBarController,但到目前为止它在新项目中一直有效。
    • 这并不奇怪。我之前在 SVC 中放了一个 UITabBarController。
    【解决方案3】:

    在我的新项目中,问题开始随机出现(不确定我做了什么改变才能让它发生)。所以我的 UI 布局中一定有什么东西导致了它。

    我听取了评论者的建议,并查看了模态视图。

    以下效果很好:

    • 将 SplitViewController 设为顶级视图
    • 使登录提示视图从 SVC 模态显示
    • 注销功能是:_loggedInController.PresentModalViewController(_loginController, true);
    • 登录功能是:_loggedInController.DismissModalViewControllerAnimated(true);
    • 修复 SVC 框架的方向代码仍需添加到 ViewDidLoad

    现在没有发生奇怪的方向问题。

    这也给了我一个很好的滑动过渡的好处,而无需添加任何代码来做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      相关资源
      最近更新 更多