Oui, il est possible de supprimer la bannière de bienvenue du Game Center par programmation à partir de votre application, du moins sous iOS 7. Mon approche est basée sur quelques observations :
- La bannière est présentée comme une UIWindow supplémentaire dans votre UIApplication.
- Cette fenêtre semble toujours apparaître à l'index 1 (en supposant que votre application n'utilise qu'une seule fenêtre).
- La bannière a une hauteur de 66 pixels sur l'iPad, 64 sur l'iPhone.
- La bannière contient une vue secondaire de 42x42 pixels pour l'icône de Game Center.
- On sait quand la bannière est susceptible d'apparaître. (c'est-à-dire dans les quelques secondes qui suivent la création d'un objet GKLocalPlayer au lancement pour tester l'authentification).
Vous pouvez donc simplement interroger les fenêtres de votre application de manière répétée pendant ces quelques secondes, en attendant que la fenêtre supplémentaire apparaisse. () Lorsque la fenêtre apparaît, vérifiez si elle contient une hiérarchie de sous-vues comme décrit ci-dessus, ce qui indique qu'il s'agit probablement de la bannière du Game Center. Si c'est le cas, réglez l'alpha de la fenêtre sur 0. C'est tout.
Voici un peu de code qui accomplit ceci dans mon application. J'appelle cette méthode immédiatement après avoir tenté d'authentifier le joueur local, et elle s'appelle elle-même pendant quelques secondes jusqu'à ce qu'elle trouve (et cache) la bannière, ou qu'elle s'arrête :
- (void)suppressGCBanner:(id)object {
int osVersion = [[[UIDevice currentDevice] systemVersion] intValue];
if (osVersion != 7) return; // only tested against iOS 7
static int iter = 0; // try for 4 seconds, typically takes about one second for banner to appear
static int origWindowCount = 0;
NSArray* windows = [UIApplication sharedApplication].windows;
if (origWindowCount == 0) origWindowCount = (int)[windows count];
BOOL ipad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad;
float bannerHeight = ipad ? 66.0f : 64.0f; // GC banner has height 66 on iPad, 64 on iPhone
if ([windows count] > origWindowCount) {
NSLog(@"suppressGCBanner: found extra window, testing");
UIWindow* window = [windows objectAtIndex:1]; // in my testing, the GC banner is always at index 1
for (UIView* view in [window subviews]) {
CGRect frame = view.frame;
NSLog(@"subview size: %f, %f", frame.size.width, frame.size.height);
if (frame.size.height != bannerHeight) continue;
for (UIView* subview in [view subviews]) {
CGRect frame = subview.frame;
NSLog(@"sub-subview size: %f, %f", frame.size.width, frame.size.height);
if (frame.size.width == 42.0f && frame.size.height == 42.0f) { // Game Center icon is 42x42
NSLog(@"found GameCenter banner: hiding. iter = %i", iter);
window.alpha = 0.0f; // make the window invisible!
return;
}
}
}
}
if (++iter > 200) {
NSLog(@"suppressGCBanner: timeout, bailing");
return;
}
// ____ otherwise recurse
[self performSelector:@selector(suppressGCBanner:) withObject:nil afterDelay:0.02f];
}
De temps en temps, vous verrez une ligne d'un pixel clignoter en haut de l'écran avant que la bannière ne soit cachée, mais en général, cette méthode semble fonctionner assez bien. Utilisez-la à vos risques et périls, et amusez-vous bien !