この質問の実際のタイトルは、私がおそらく収まらないほど長いです。
ルートビューコントローラーが縦向きのみをサポートするが、ホーム画面が横向きのときにiPhone 6 Plusで横向きをサポートするアプリを起動すると、アプリのウィンドウは横向きであるがデバイスは横向きの状態になります縦向きで。
つまり、次のようになります。
次のようになっている場合:
再現手順:
iOS 8.0を実行しているiPhone 6 Plus。
Plistが縦向き以外のすべての方向をサポートするアプリ。
アプリのルートビューコントローラーはUITabBarControllerです。
すべて、Tab Bar Controllerおよびそのすべての子孫View Controllerは、UIInterfaceOrientationMaskPortrait
からsupportedInterfaceOrientations
を返します。
IOSのホーム画面から開始します。
横向きに回転します(iPhone 6 Plusが必要です)。
アプリをコールド起動します。
結果:インターフェースの向きが壊れています。
横向きを完全に無効にするために、縦向きexceptを強制する他の方法は考えられません。
UITabBarControllerをサブクラス化して、supportedInterfaceOrientationsをオーバーライドしてポートレート専用マスクを返すことも試みましたが、これは(上記の他のすべてのステップでも)問題を修正しませんでした。
これは、UITabBarControllerをルートビューコントローラーとして使用する場合のiOS 8のバグのようです。回避策は、主にVanilla UIViewControllerをルートビューコントローラーとして使用することです。このVanilla View Controllerは、Tab Bar Controllerの親View Controllerとして機能します。
///------------------------
/// Portrait-Only Container
///------------------------
@interface PortraitOnlyContainerViewController : UIViewController
@end
@implementation PortraitOnlyContainerViewController
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
@end
// Elsewhere, in app did finish launching ...
PortraitOnlyContainerViewController *container = nil;
container = [[PortraitOnlyContainerViewController alloc]
initWithNibName:nil
bundle:nil];
[container addChildViewController:self.tabBarController];
self.tabBarController.view.frame = container.view.bounds;
[container.view addSubview:self.tabBarController.view];
[self.tabBarController didMoveToParentViewController:container];
[self.window setRootViewController:container];
IPhone 6 Plusで横向きでアプリを起動したときにも同じ問題がありました。
私たちの修正は、プロジェクト設定を介してplistからランドスケープをサポートするインターフェイスの向きを削除することでした:
アプリのデリゲートでapplication:supportedInterfaceOrientationsForWindow:を実装します。
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
どうやらplistの情報は、アプリの起動を許可する方向を指定することです。
statusBarOrientation
のUIApplication
を設定すると、うまくいくようです。アプリのデリゲートのapplication:didFinishLaunchingWithOptions:
メソッドに配置しました。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
application.statusBarOrientation = UIInterfaceOrientationPortrait;
// the rest of the method
}
私は非常に似た問題を抱えていました。ビデオを再生することを除いて、どこでもポートレートモードを強制したかった。
私がしたことは:
1)AppDelegateでアプリの向きを強制的に縦向きにするには:
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if ([window.rootViewController.presentedViewController isKindOfClass:[MPMoviePlayerViewController class]])
{
return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskPortrait;
}
2)空のモーダルView Controllerを起動すると、私の場合の問題が修正されました。 NavigationViewController(アプリケーションの起動後に表示される最初のView Controller)のルートにある最初のView ControllerのviewDidLoadで起動します:
- (void)showAndHideNamelessViewControllerToFixOrientation {
UIViewController* viewController = [[UIViewController alloc] init];
[self presentViewController:viewController animated:NO completion:nil];
[viewController dismissViewControllerAnimated:NO completion:nil];
}
次のコードを試してください。おそらく、この問題は、ランドスケープ起動時のキーウィンドウのサイズが原因です。
// in application:didFinishLaunchingWithOptions: ...
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
[self.window setFrame:[[UIScreen mainScreen] bounds]]; //<- ADD!!
アプリをランドスケープモードでのみ開きたい(そして、iPhone 6 Plusで上記の問題が発生しない)ため、Landscape (left home button)
およびLandscape (right home button)
を唯一の向きとして設定します私のアプリのPLISTファイル。これにより、アプリを開いたときの向きの問題が修正されます。ただし、アプリでUIImagePickerController
を表示するため、1つのビューでのみポートレートモードをサポートする必要があります。これは、iPhoneでポートレートモードで表示する必要があるAppleが必要です。
次のコードをAppDelegate
に含めることで、アプリを横長モードで開いたまま、その1つのビューのみのポートレートをサポートできました。
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
return UIInterfaceOrientationMaskAllButUpsideDown;
} else {
return UIInterfaceOrientationMaskAll;
}
}
一般的なコンテナビューコントローラを使用したJaredによる回避策は、私には運がありません。運のないsupportedInterfaceOrientationsを備えたTab Bar Controllerを既にサブクラス化しています。起動後の6+の向きに関係なく、タブバーのウィンドウはframe = (0 0; 736 414)
を報告しています
これまでのところ、私が見つけた唯一の回避策は、makeKeyAndVisibleの後にウィンドウフレームを強制することです
[self.window makeKeyAndVisible]; self.window.frame = CGRectMake(0, 0, MIN(CGRectGetWidth(self.window.frame), CGRectGetHeight(self.window.frame)), MAX(CGRectGetWidth(self.window.frame), CGRectGetHeight(self.window.frame)));
私はアプリで同じバグを見つけましたが、これで解決しました ソリューション
最初はうまくいきませんでしたが、いくつかの掘り出しの後、スプラッシュ画面の後に最初のコントローラーでそれをしなければなりません。
答えはOjbC言語で、Swiftに更新できます
override var shouldAutorotate: Bool {
return true
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
それが最初のView Controllerにあることを忘れないでください。
私も同じ状況にあり、[self.window setFrame:...]を実行してもうまくいきません。
Application:didFinishLaunchingWithOptionsの最後に以下を追加するだけで動作することがわかりました。画面を点滅させ、きれいで効率的ではありません。
Application:didFinishLaunchingWithOptionsの最後にこれを追加しました:
UIViewController *portraitViewController = [[UIViewController alloc] init];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:portraitViewController];
[self.navController presentViewController:nc animated:NO completion:nil];
[self.navController dismissViewControllerAnimated:NO completion:nil];
[UIViewController attemptRotationToDeviceOrientation];
私にとっては、jaredsinclairと同じ問題を抱えていましたが、UIViewController
をsupportedInterfaceOrientations
メソッドでサブクラス化しても問題は解決しませんでした。代わりに、私のappDidFinishLaunching
のAppDelegate
メソッドで彼がやったことを正確に行い、サブクラスではなく通常のUITabBarController
の子としてUIViewController
を追加しました。出来た!
同様の問題がありました。UITabBarControllerをルートビューコントローラーとして使用して、アプリをランドスケープとポートレートの両方で実行します。
横向きモードでアプリを起動すると、表示が正しくありませんでした。
私がしなければならなかったすべて:-XIBでrootviewコントローラーの割り当てを削除します。 -アプリが起動したら、手動で追加します。
(void)applicationDidFinishLaunching:(UIApplication *)application {application.statusBarHidden = YES;
[self.window setRootViewController:self.tabBarController];
これで問題は解決しました。