実際、ここで述べたウィンドウ ビューの最初のビューを削除して挿入する方法は機能します。
横向きのUIWebview youtubeからiOS縦向きのみのアプリが返される
何らかの理由で、ウィンドウのサブビューで最初のビューを要求しないようにする必要があります。代わりにルートビューを自分で提供する必要があります。
したがって、私の解決策は、両方の向きをサポートするView Controllerに次のメソッドを実装することです:
-(void)viewWillAppear:(BOOL)animated
{
m_b_avoid_landscape_orinetation = NO;
[super viewWillAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated
{
m_b_avoid_landscape_orinetation = YES;
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
[[self getTabBar].view removeFromSuperview];
[window addSubview:[self getTabBar].view];
[super viewWillDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
if (m_b_avoid_landscape_orinetation)
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
else
return YES;
}
[self getTabBar] は、ウィンドウのサブビューの最初のビューとして機能するカスタム タブ バーを提供します。
編集iOS 6 ではもう動作しません。新しい supportedInterfaceOrientations メソッドを使用して、他の場所で説明したように、モーダル ダイアログを挿入および削除するソリューションを使用しました。
-(void)goBack
{
m_b_avoid_landscpae_orinetation = YES;
UIViewController *viewController = [[UIViewController alloc] init];
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
[window.rootViewController presentViewController:viewController animated:NO completion:^{
[viewController dismissModalViewControllerAnimated:NO];
}];
[self.navigationController popViewControllerAnimated:YES];
}
-(NSUInteger)supportedInterfaceOrientations
{
if (m_b_avoid_landscpae_orinetation)
return UIInterfaceOrientationMaskPortrait;
return UIInterfaceOrientationMaskAllButUpsideDown;
}