Вот недокументированный обходной путь, но он был одобрен в нескольких играх, над которыми я работал:
GKLeaderboardViewController *viewController = [[GKLeaderboardViewController alloc] init];
viewController.leaderboardDelegate = self;
[viewController popViewControllerAnimated:NO];
[parent presentModalViewController:viewController animated:YES];
[viewController release];
Пояснение:
GKLeaderboardViewController
является подклассом UINavigationController
- Контроллер представления определенной категории автоматически помещается поверх стека навигации контроллера представления списка лидеров
- Перед отображением вы уже можете изменить стек навигации
- При отсутствии анимации всплывающее окно происходит мгновенно и до того, как контроллер представления даже будет представлен.
Вы можете пропустить настройку категории и временного диапазона, поскольку они вам не нужны (вы не будете отображать контроллер вида определенной категории). Даже если вы не установите его, контроллер представления таблицы лидеров будет выдвигать контроллер представления по умолчанию сверху.
Я дополнительно выпустил переменную viewController
(контроллер представления таблицы лидеров), так как parent
контроллер представления будет становиться владельцем объекта. Следовательно, не освобождение его приводит к утечке памяти и может иметь другие непредвиденные последствия.
iOS 6 и более поздние версии имеют класс GKGameCenterViewController
. Слабая ссылка на GameKit и тест на наличие этого класса с NSClassFromString(@"GKGameCenterViewController") != nil
. Затем используйте его как обычно.
Создайте экземпляр этого класса вместо GKLeaderboardViewController
и установите для его свойства viewState
значение GKGameCenterViewControllerStateLeaderboards
, чтобы списки лидеров отображались немедленно.