Sí, es posible suprimir el Centro de Juego pancarta de Bienvenida mediante programación desde dentro de la aplicación, al menos en iOS 7. Mi enfoque se basa en un par de observaciones:
- El banner se presenta como un adicional UIWindow dentro de su UIApplication.
- Esta ventana siempre aparece en el índice 1. (suponiendo que su aplicación sólo utiliza una ventana.)
- La bandera es de 66 píxeles de alta en el iPad, 64 en el iPhone.
- La bandera contiene un 42x42 pixel subvista para el Centro de Juego de icono.
- Se sabe cuando la bandera es probable que aparezca. (es decir dentro de un par de segundos de la creación de un GKLocalPlayer objeto en el lanzamiento de prueba de autenticación).
Así que usted puede simplemente encuesta de la aplicación de windows varias veces a lo largo de estos pocos segundos, esperando a que el extra de la ventana a aparecer. (Clave-valor de la observación es probablemente la manera "correcta" de hacer esto, pero soy perezoso.) Cuando la ventana de muestra, prueba si contiene una subvista jerarquía, tal como se describió anteriormente, lo que indica que es probablemente el Juego de Centro de la bandera. Si es así, establece el alfa de la ventana a 0. Eso es todo.
Aquí está el código que realiza esta en mi aplicación. Yo llamo a este método inmediatamente después de intentar autenticar el jugador local, y se llama a sí mismo durante unos segundos hasta que se encuentra (y oculta) en el banner, o más veces:
- (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 vas a ver un solo píxel de la línea de parpadeo en la parte superior de la pantalla antes de que la bandera está oculto, pero en general este método parece funcionar bastante bien. Utilice a su propio riesgo, y ¡a disfrutar!