0

我有一个使用 6.1 SDK 的 Monotouch 6.0.10 iPhone 应用程序,但针对 iOS 4.0 及更高版本,我尝试使用 ShouldAutorotateToInterfaceOrientation 仅将其中一个视图强制为纵向,但未成功。我意识到它现在已被弃用,但仍然需要支持 iOS4/iOS5 设备。

为了尝试隔离问题,我编写了一个最小的测试应用程序。它没有 XIB,并且有一个带有一个选项卡的 UITabBarController。该选项卡有一个 UINavigationController 并且 UINavigationController 有一个 UIViewController(带有一个 hello world 按钮可以单击)。

在 AppDelegate 我有:

tabController = new TabController();
window.RootViewController = tabController;

在 UITabBarController 和 UINavigationController 我有:

public override bool ShouldAutorotateToInterfaceOrientation(UIInterfaceOrientation toInterfaceOrientation)
    {
        return true;
    }

在 UIViewController 我有:

public override bool ShouldAutorotateToInterfaceOrientation(UIInterfaceOrientation toInterfaceOrientation)
{
    if ( toInterfaceOrientation == UIInterfaceOrientation.Portrait )
    {
        return true;
    }
    else
    {
        return false;
    }
}

好吧,至少在 iOS 6.1 设备上,那些 ShouldAutorotateToInterfaceOrientation 似乎完全被忽略了。没有达到断点,如果我在每种情况下都强制它们返回 false,旋转仍然会发生。

我的理解是,ShouldAutomaticallyForwardRotationMethods 默认为 true,因此似乎无法提供解决方案。除了 Glen Schmidt 的建议外,没有运气梳理了论坛:iOS 6 轮换:supportedInterfaceOrientations 不起作用?但不幸的是,我不知道如何将其转换为 MonoTouch:

引用

If you want to replicate the pre-iOS 6 behaviour where all the views in the navigation stack / tab bar have to agree on an allowable set of orientations, put this in your subclass of UITabBarController or UINavigationController:

- (NSUInteger)supportedInterfaceOrientations
{
    NSUInteger orientations = [super supportedInterfaceOrientations];

    for (UIViewController *controller in self.viewControllers)
        orientations = orientations & [controller supportedInterfaceOrientations];

    return orientations;
}

取消报价

我也明白我什至不能希望通过 ShouldAutoRotate/SupportedInterfaceOrientations 为我的 iOS6 用户解决它,因为这会导致 iOS4/IOS5 旋转失败。

任何建议都非常感谢!

账单。

4

1 回答 1

2

经过一番折腾,找到了一个可行的解决方案。有人可能会对此进行改进。

问题

我的应用基于 SDK 6.1,面向 iOS4、iOS5 和 iOS6 设备。它需要允许所有屏幕旋转,除了必须固定为纵向的屏幕。该应用程序有一个 UITabBarController,大多数选项卡都有一个 UINavigationController,下面有堆叠的视图。

解决方案

对于 iOS4/iOS5 用户,关键是应用程序的根视图控制器(在我的例子中是标签栏控制器)中已弃用的 ShouldAutorotateToInterfaceOrientation() 方法。该方法不会在任何其他视图控制器中自动调用,但根视图控制器当然可以调用当前视图控制器中的同名方法。

对于 iOS6 用户,关键是应用程序根视图控制器中的 ShouldAutorotate() / GetSupportedInterfaceOrientations()。同样,这些方法不会在任何其他视图控制器中自动调用,但根视图控制器可以调用当前视图控制器中的同名方法。

对于我在原始帖子中描述的简单测试应用程序:

在 AppDelegate/FinishedLaunching 中:

window.RootViewController = tabController;

在 AppDelegate 中:

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations (UIApplication application, UIWindow forWindow)
{
    return UIInterfaceOrientationMask.All;
}

在 TabController 中:

public override bool ShouldAutorotateToInterfaceOrientation(UIInterfaceOrientation toInterfaceOrientation)  // iOS4/iOS5 only
{
    try
    {
        UINavigationController navController = (UINavigationController)SelectedViewController;
        UIViewController targetController = navController.ViewControllers[0];
        if ( targetController.Title == "Greetings")
        {
            if ( toInterfaceOrientation == UIInterfaceOrientation.Portrait )
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    catch
    {
        return true;
    }
    return true;
}

public override bool ShouldAutorotate() // iOS6+ only
{
    return true;
}

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()  // iOS6+ only
{
    try
    {
        UINavigationController navController = (UINavigationController)SelectedViewController;
        UIViewController targetController = navController.ViewControllers[0];
        return targetController.GetSupportedInterfaceOrientations();
    }
    catch
    {
        return UIInterfaceOrientationMask.All;
    }
    return UIInterfaceOrientationMask.All;
}

在需要纵向的视图控制器中:

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()  // iOS6+ only
{
    return UIInterfaceOrientationMask.Portrait;
}

我的实际应用程序需要一些更精细但沿线相同的东西。例如在标签栏控制器中:

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
{
    try
    {
        UINavigationController navController = (UINavigationController)SelectedViewController;
        if ( navController.Title == "Tracking" )        // Are we on the Tracking tab?
        {
            // Yes. Looking for RedLaser's BarcodePickerController
            UIViewController targetController = navController.ViewControllers[1];       // BarcodePicker would be second on nav stack
            string controllerType = targetController.GetType().Name;

            if ( controllerType == "BarcodePickerController" )                          // Is this BarcodePicker?   
            {
                return UIInterfaceOrientationMask.Portrait;                             // Yes, force portrait orientation                          
            }
        }
        else
        {
            return UIInterfaceOrientationMask.All;                                      // No, allow any orientation
        }
    }
    catch
    {
        return UIInterfaceOrientationMask.All;                                          // Not BarcodePicker, allow any orientation
    }
    return UIInterfaceOrientationMask.All;
}
于 2013-02-26T09:31:34.617 回答