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ユーザーのためだけにそれを解決することさえ期待できないことも理解しています。
どんな提案でも大歓迎です!
明細書。