0

6.1SDKを使用するMonotouch6.0.10iPhoneアプリを使用していますが、iOS 4.0以降を対象としており、ShouldAutorotateToInterfaceOrientationを使用して、ビューの1つだけを縦向きに強制しようとして失敗しました。今では非推奨になっていると思いますが、それでもiOS4/iOS5デバイスをサポートする必要があります。

問題を特定するために、最小限のテストアプリを作成しました。XIBがなく、タブが1つある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に設定されているため、解決策を提供していないようです。ここでGlenSchmidtからの提案を除いて、運が悪かったフォーラムをまとめました: 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;
}

UNQUOTE

また、iOS4 / IOS5の回転が失敗する原因となるため、ShouldAutoRotate/SupportedInterfaceOrientationsを介してiOS6ユーザーのためだけにそれを解決することさえ期待できないことも理解しています。

どんな提案でも大歓迎です!

明細書。

4

1 に答える 1

2

かなりのスラッシングの後、うまくいく解決策を見つけました。誰かがこれを改善できるかもしれません。

問題

SDK 6.1に基づく私のアプリは、iOS4、iOS5、およびiOS6デバイスを対象としています。縦向きに固定する必要がある画面を除いて、すべての画面を回転できるようにする必要があります。アプリにはUITabBarControllerがあり、ほとんどのタブにはUINavigationControllerがあり、その下にスタックビューがあります。

解決

iOS4 / iOS5ユーザーの場合、キーはアプリのルートビューコントローラー(私の場合はタブバーコントローラー)の非推奨のShouldAutorotateToInterfaceOrientation()メソッドです。このメソッドは、他のView Controllerでは自動的に呼び出されませんが、もちろん、ルートViewControllerは現在のViewControllerで同じ名前のメソッドを呼び出すことができます。

iOS6ユーザーの場合、キーはアプリのルートビューコントローラーのShouldAutorotate()/ GetSupportedInterfaceOrientations()です。この場合も、これらのメソッドは他のView Controllerで自動的に呼び出されることはありませんが、ルートViewControllerは現在のViewControllerで同じ名前のメソッドを呼び出すことができます。

元の投稿で説明されている私の簡単なテストアプリの場合:

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;
}

縦向きである必要があるViewControllerの場合:

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 に答える