0

私のアプリケーションはナビゲーション ベースで、主に縦向きで実行されますが、1 つのビュー コントローラーは縦向きと横向きの両方をサポートします。問題は、ランドスケープビューコントローラーから新しいビューコントローラーをプッシュすると、ポートレートモードで欲しいのに、新しいビューコントローラーもランドスケープモードでプッシュされることです。

また、ランドスケープコントローラーからビューコントローラーをポップすると、ポップされたビューコントローラーがポートレートモードで表示されます。

私のコードの何が問題なのかわかりません。

これらのオリエンテーション サポートに使用される私のコード スニペットと情報を次に示します。

info.plist ファイルでは、すべての向きをサポートしていましたが、縦向きは逆さまでした。

以下のように、ナビゲーションコントローラーのカテゴリにもカテゴリを追加しました。

@implementation UINavigationController(Rotation_IOS6)
-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end

また、すべてのクラスのスーパークラスとして機能する UIViewController サブクラスも作成しました。スーパー クラスのオリエンテーション メソッドは次のとおりです。

@implementation ParentViewController

- (BOOL)shouldAutorotate{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationPortrait;
}
@end

また、ランドスケープをサポートするオリエンテーション メソッド コントローラーは次のとおりです。

@implementation LandscapeController
#pragma mark -
#pragma mark Orientation Methods
- (BOOL)shouldAutorotate{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskLandscape;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    return (toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end

前もって感謝します。

4

2 に答える 2

0

ビューをプッシュする方法は次のとおりです。オブジェクトスイッチを取得します

switch.m で

+ (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease
{

VControllerToLoad.navigationController.navigationBar.frame=CGRectMake(0, 0, 568, 44);
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect windowFrame = [[UIScreen mainScreen] bounds];
CGRect firstViewFrame = CGRectMake(statusBarFrame.origin.x, statusBarFrame.size.height, windowFrame.size.width, windowFrame.size.height - statusBarFrame.size.height);
VControllerToLoad.view.frame = firstViewFrame;

//check version and go

if (IOS_OLDER_THAN_6)
{
    [((AppDelegate*)[UIApplication sharedApplication].delegate).window addSubview:VControllerToLoad.view];
}
else
{
    [((AppDelegate*)[UIApplication sharedApplication].delegate).window setRootViewController:VControllerToLoad];

}
  [VControllerToRelease.view removeFromSuperview];
}

上記の方法を使用して、このように横向きモードから縦向き表示にプッシュできます

 PortraitViewController *portraitVC=[[PortraitViewController alloc]initWithNibName:@"PortraitViewController" bundle:nil];

  [Switch loadController:portraitVC andRelease:self];

横向きのビュー controller.m で

    - (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationController.title=@"Landscape";
    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.navigationController.navigationBarHidden = NO;
    if (IOS_OLDER_THAN_6)
        [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];
    // Do any additional setup after loading the view from its nib.
}

#ifdef IOS_NEWER_OR_EQUAL_TO_6

-(BOOL)shouldAutorotate  
{
    return YES; 
 }

- (NSUInteger)supportedInterfaceOrientations    
 {
    return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft; 
 }

#endif
于 2013-02-15T14:45:12.303 に答える
0

同様の問題がありました。私の場合、この1つのView Controllerを常に横向きに表示する必要があり、途中で他のView Controllerを縦向きに戻す必要がありました。

FAQ で次の解決策を見つけました: iPhone Landscape FAQ and Solutions

このアイデアの重要なポイントは、デバイスを強制的に特定の向きにするには、次の 1 つの方法しかないということです。 1. ステータス バーの向きを設定します。2. 対象の向きをサポートする View Controller をモーダル (!) に表​​示します。

さて、あなたはモーダルに何かを提示したくないですか?心配しないでください。あなたを止めるものは何もありません... そのようにすると、ユーザーには表示されません。ただし、それが完了すると、デバイスはまさにこの向きのままになります。4. ストーリーボードを使用する場合は、表示したいビュー コントローラーをプッシュします。

私には、それが唯一の実行可能な解決策のように思えました。FAQ のその回答に加えて、他のすべても適切に設定する必要があります。プロジェクト全体でサポートされるデバイスの向きは、基本的にすべてである必要があります。各ビュー コントローラーでサポートされている方向は、各ビュー コントローラーがサポートし、shouldAutoRotateを返す必要があるものである必要がありますYES。タブ バー コントローラーが関係している場合は、さらに難しくなります。アプリがタブ バーに基づいている場合は、私に連絡してください。

于 2013-02-15T15:07:49.713 に答える