Отображение модального вида Game Center в альбомной ориентации - PullRequest
0 голосов
/ 03 февраля 2012

Я использую движок cocos2d в альбомной ориентации без автоповорота.

Я хочу отобразить стандартное модальное представление достижений ГХ.Он отображается нормально, снизу экрана (удерживая устройство в альбомной ориентации), но отклоняется в правую часть экрана (как портретные модальные виды).Кажется, что это меняет ориентацию для анимации отклонения, но вид не вращается до этого.Он просто сдвигается вправо.

Также в консоли появляется предупреждение:

Unbalanced calls to begin/end appearance transitions for <UIViewController: 0x41b9a0>.

Вот как я показываю этот контроллер:

-(void)showAchievements:(id) sender {

    utilityController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    [[[CCDirector sharedDirector] openGLView] addSubview:utilityController.view]; 

    GKAchievementViewController *achievements = [[GKAchievementViewController alloc] init];
    if (achievements != nil)
    {
        achievements.achievementDelegate = self;
        [utilityController presentModalViewController: achievements animated: YES];
    }
    [achievements release];
}

- (void)achievementViewControllerDidFinish:(GKAchievementViewController *)viewController
{
    [utilityController dismissModalViewControllerAnimated:YES];
    [utilityController release];
}

В gameConfig.hУ меня следующая конфигурация:

#define GAME_AUTOROTATION kGameAutorotationNone

Пытался изменить это на kGameAutorotationCCDirector - то же самое.kGameAutorotationUIViewController - uiviews прыгают по всему экрану.

Пожалуйста, не предлагайте вращать UIView с CGAffineTransformMakeRotation - это просто взлом ...

Ответы [ 3 ]

1 голос
/ 09 августа 2012

Это мой первый ответ на Stackoverflow, поэтому, пожалуйста, прости меня, если форматирование может не сработать

В любом случае, к коду.Это решение работает для меня, для Achievements-Viewcontroller.Любой другой GK-Viewcontroller может работать соответственно ...

@implementation GKAchievementViewController (OrientationFix)

-(BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation
{
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

@end


@interface GKLeaderboardViewController (OrientationFix)

@end


-(void)showAchievements
{
    GKAchievementViewController *achievements = [[GKAchievementViewController alloc] init];

    if (achievements != nil)
    {
        achievements.achievementDelegate = self;
        [self presentModalViewController: achievements animated: YES];
    }

    [achievements release]; 
}

- (void)achievementViewControllerDidFinish: (GKAchievementViewController *)viewController 
{
    AppDelegate *delegate = [UIApplication sharedApplication].delegate; 
    [delegate.viewController dismissModalViewControllerAnimated:YES];
}
1 голос
/ 03 февраля 2012

Для Kobold2D Я решил эту проблему для всех ориентаций с категорией для GKMatchmakerViewController . Вы можете сделать ту же категорию для других контроллеров представления Game Center.

Это заставит виды GC использовать текущую ориентацию устройства:

@implementation GKMatchmakerViewController (OrientationFix)
-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // [RootViewController option removed for clarity]

    // all other autorotation types use the current device orientation
    ccDeviceOrientation orientation = [CCDirector sharedDirector].deviceOrientation;
    switch (interfaceOrientation)
    {
        case UIInterfaceOrientationPortrait:
            return (orientation == kCCDeviceOrientationPortrait);
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            return (orientation == kCCDeviceOrientationPortraitUpsideDown);
            break;
        case UIInterfaceOrientationLandscapeLeft:
            return (orientation == kCCDeviceOrientationLandscapeRight);
            break;
        case UIInterfaceOrientationLandscapeRight:
            return (orientation == kCCDeviceOrientationLandscapeLeft);
            break;
        default:
            break;
    }

    return NO;
}
@end
0 голосов
/ 05 декабря 2012

Попробуйте позвонить

     self.modalPresentationStyle = UIModalPresentationCurrentContext;

Перед представлением ViewController

...