Sì, è possibile sopprimere il banner di benvenuto Game Center a livello di programmazione dalla tua app, almeno in iOS 7. Il mio approccio si basa su alcune osservazioni:
- Il banner viene presentato come UIWindow aggiuntivo nella tua applicazione UIA.
- Questa finestra sembra sempre visualizzata all'indice 1. (presumendo che la tua app utilizzi solo una finestra.)
- Il banner è alto 66 pixel su iPad, 64 su iPhone.
- Il banner contiene una sottoview di 42x42 pixel per l'icona di Game Center.
- È noto quando è probabile che il banner appaia. (entro pochi secondi dalla creazione di un oggetto GKLocalPlayer all'avvio per testare l'autenticazione).
Quindi puoi semplicemente eseguire il polling delle finestre dell'applicazione più volte in questi pochi secondi, in attesa che venga visualizzata la finestra aggiuntiva. (L'osservazione dei valori-chiave è probabilmente il modo "corretto" per farlo, ma io sono pigro.) Quando appare la finestra, verifica se contiene una gerarchia di subview come descritto sopra, il che indica che probabilmente è il banner del Game Center. Se lo è, imposta l'alfa della finestra su 0. Ecco fatto.
Ecco un codice che realizza ciò nella mia app. Chiamo questo metodo immediatamente dopo aver tentato di autenticare il lettore locale, e si chiama per alcuni secondi fino a quando non trova (e nasconde) il banner, altrimenti scade:
- (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];
}
Di tanto in tanto vedrai uno sfarfallio di linea a pixel singolo nella parte superiore dello schermo prima che il banner sia nascosto, ma in generale questo metodo sembra funzionare abbastanza bene. Usa a tuo rischio e divertiti!