1

かなり一般的な問題のようですが、ソリューションの検索と実装がうまくいきませんでした。

横向きのみを目的としたCocos2dゲームを作成しましたが、Gamecenterにアクセスする必要があります。Gamecenterはポートレートモードを有効にして動作していますが、ゲームをポートレートモードに切り替えることもできます。

私は次の修正を試みました:

iOS6でのみ横向きのゲームセンターログインロック

ランドスケープのみのアプリでのGameCenter認証はUIApplicationInvalidInterfaceOrientationをスローします

横向きのみのcocos2dアプリにGameCenterを追加した後のiOS6でのエラー

Cocos 2d 2.0は自動回転が機能しないはずですか?

問題は、UIViewControllersの代わりにCCLayersを使用してゲームを構築したことだと思います

例:MenuLayer.h

@interface MenuLayer : CCLayer <GKAchievementViewControllerDelegate, GKLeaderboardViewControllerDelegate, UINavigationControllerDelegate>{
   ..my header info..
}

MenuLayer.m

...
-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}
-(BOOL)shouldAutorotate {
    return [[UIDevice currentDevice] orientation] != UIInterfaceOrientationPortrait;
}

-(void)authenticateLocalPlayer
{

    GKLocalPlayer * localPlayer= [GKLocalPlayer localPlayer];

    if(localPlayer.authenticated == NO)
    {
        NSString *reqSysVer = @"6.0";
        NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
        if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
        {
            [[GKLocalPlayer localPlayer] setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) {
                if (viewcontroller != nil) {
                    AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];
                    [[app navController] presentModalViewController:viewcontroller animated:YES];
                }else if ([GKLocalPlayer localPlayer].authenticated)
                {
                    //do some stuff
                }
            })];
        }
        else
        {
            [localPlayer authenticateWithCompletionHandler:^(NSError *error){
                if(localPlayer.isAuthenticated)
                {
                    //Peform Additionl Tasks for the authenticated player.
                }
            }];
        }
    }

}
...

UIViewControllersの代わりにCCLayersを使用してゲームを構築したので、どのような選択肢がありますか?CCLayersがusesupportedInterfaceOrientationsまたはshouldAutorotateを呼び出さないと仮定して正しいですか?

または、問題を修正するためにこのコードを何らかの方法で変更することになっていますか?

// Create a Navigation Controller with the Director
navController_ = [[UINavigationController alloc] initWithRootViewController:director_];
navController_.navigationBarHidden = YES;
4

1 に答える 1

5

これもしばらくの間私を苛立たせました。ネットでしばらく調べた後、いくつかのソースを見つけ、いくつかはiOS 6で動作し、いくつかはiOS5で動作しましたが、iOS5とiOS6の両方で希望どおりに動作するようにいくつかの変更を加える必要がありました。これは私が使用しているコードで、5.1と6を使用しているiPhoneで動作します。GameCenterのログインは引き続き縦向きで表示され、それについてできることは何もないようです。ただし、ゲームの残りの部分はランドスケープモードのままになります。

  1. ビルド設定(info.plist)でサポートされている方向としてポートレートモードを有効にします。
  2. UINavigationControllerの新しいサブクラスを作成します。このクラスには、わかりやすい名前を付けてください。
  3. AppDelegateに、新しいカスタムUINavigationControllerヘッダーファイルをインクルードします。
  4. App Delegateで、元の呼び出しをコメントアウトし、代わりにカスタムクラスを呼び出します。

それでうまくいくはずです。これが私のカスタムクラスのコードです:

#import <UIKit/UIKit.h>

@interface CustomNavigationViewController : UINavigationController

-(UIInterfaceOrientation) getCurrentOrientation;

@end

そして実装ファイル:

#import "CustomNavigationViewController.h"

@interface CustomNavigationViewController ()

@end

@implementation CustomNavigationViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// This is required to allow GameCenter to login in portrait mode, but only allow landscape mode for the rest of the game play/
// Arrrgg!

-(BOOL) shouldAutorotate {
    return YES;
}

-(NSUInteger) supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

-(UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationLandscapeRight; // or left if you prefer
}

-(NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        return UIInterfaceOrientationMaskLandscape;
    else {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
}

-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return [[UIDevice currentDevice] orientation] != UIInterfaceOrientationPortrait;
}

-(UIInterfaceOrientation) getCurrentOrientation {
    return [[UIDevice currentDevice] orientation];
}

@end

最後の方法は必須ではないことに注意してくださいgetCurrentOrientation。現在の向きを確認したい場合に備えて、最後の方法をそこに入れます。

カスタムクラスは、AppDelegate.mで次のように呼び出されます:(元のコードをコメントアウトする)

navController = [[CustomNavigationViewController alloc] initWithRootViewController:director];
window.rootViewController = navController;
navController.navigationBarHidden = YES;
[window makeKeyAndVisible];

お役に立てれば。

于 2013-01-10T23:33:53.617 に答える