Отображение модального представления Game Center в альбомной ориентации

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

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

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

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 - это просто хак ...


person Evgeny Aleksandrov    schedule 03.02.2012    source источник


Ответы (3)


Для 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
person LearnCocos2D    schedule 03.02.2012
comment
Спасибо за ответ, но это исправление ориентации не работает для GKAchievementViewController для меня. Этот вид по-прежнему сдвигается снизу вверх при запуске, а после закрытия - переходит в правую часть экрана. - person Evgeny Aleksandrov; 06.02.2012
comment
Напоминаем, что этот пример кода предназначен для GKMatchmakerViewController. Вы уверены, что изменили его для GKAchievementViewController? - person erkanyildiz; 21.02.2012
comment
Да, конечно .. Оставил так работать на этот раз. Разберемся позже. - person Evgeny Aleksandrov; 12.03.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];
}
person Richard Löwenstein    schedule 09.08.2012

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

     self.modalPresentationStyle = UIModalPresentationCurrentContext;

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

person Antzi    schedule 05.12.2012