Sí, es posible suprimir el banner de bienvenida de Game Center programáticamente desde su aplicación, al menos en iOS 7. Mi enfoque se basa en algunas observaciones:
- El banner se presenta como una ventana UI adicional dentro de su aplicación UIA.
- Parece que esta ventana siempre aparece en el índice 1. (suponiendo que su aplicación solo usa una ventana).
- El banner tiene 66 píxeles de alto en iPad, 64 en iPhone.
- El banner contiene una subvista de 42x42 píxeles para el icono de Game Center.
- Se sabe cuándo es probable que aparezca el banner. (es decir, a los pocos segundos de crear un objeto GKLocalPlayer en el inicio para probar la autenticación).
Por lo tanto, puede simplemente sondear las ventanas de su aplicación repetidamente en estos pocos segundos, esperando que aparezca la ventana adicional. (La observación de valores clave es probablemente la forma "correcta" de hacer esto, pero soy perezoso). Cuando se muestre la ventana, compruebe si contiene una jerarquía de subvistas como la descrita anteriormente, lo que indica que probablemente sea la pancarta de Game Center. Si es así, establece el alfa de la ventana en 0. Eso es todo.
Aquí hay un código que logra esto en mi aplicación. Llamo a este método inmediatamente después de intentar autenticar al jugador local, y se llama a sí mismo durante unos segundos hasta que encuentra (y oculta) el banner, o si no se agota:
- (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 vez en cuando verás un parpadeo de línea de un solo píxel en la parte superior de la pantalla antes de que se oculte el banner, pero en general este método parece funcionar lo suficientemente bien. Úsalo bajo tu propio riesgo, y disfruta!