Ja, het is mogelijk om de welkomstbanner van Game Center programmatisch te onderdrukken vanuit uw app, in ieder geval onder iOS 7. Mijn benadering is gebaseerd op een paar observaties:
- De banner wordt gepresenteerd als een extra UIWindow binnen uw UIApplication.
- Dit venster lijkt altijd te verschijnen bij index 1. (ervan uitgaande dat uw app maar één venster gebruikt.)
- De banner is 66 pixels hoog op iPad, 64 op iPhone.
- De banner bevat een subweergave van 42x42 pixels voor het Game Center-pictogram.
- Het is bekend wanneer de banner waarschijnlijk zal verschijnen. (dwz binnen een paar seconden na het aanmaken van een GKLocalPlayer-object bij het starten om de authenticatie te testen.)
U kunt dus eenvoudig de vensters van uw applicatie gedurende deze paar seconden herhaaldelijk pollen, wachtend tot het extra venster verschijnt . (Observeren van sleutelwaarden is waarschijnlijk de "juiste" manier om dit te doen, maar ik ben lui.) Als het venster verschijnt, test dan of het een subview-hiërarchie bevat zoals hierboven beschreven, wat aangeeft dat het waarschijnlijk de Game Center-banner is. Als dit het geval is, stelt u de alfa van het venster in op 0. Dat is alles.
Hier is een code die dit in mijn app doet. Ik roep deze methode onmiddellijk aan nadat ik heb geprobeerd de lokale speler te authenticeren, en hij roept zichzelf een paar seconden aan totdat hij de banner vindt (en verbergt), of anders een time-out:
- (void) suppressGCBanner: (id) object {int osVersion = [[[UIDevice currentDevice] systemVersion] intValue]; if (osVersion! = 7) terugkeer; // alleen getest tegen iOS 7 statische int iter = 0; // probeer het 4 seconden, het duurt normaal gesproken ongeveer een seconde voordat de banner statisch verschijnt int origWindowCount = 0; NSArray * windows = [UIApplication sharedApplication] .windows; if (origWindowCount == 0) origWindowCount = (int) [windows count]; BOOL ipad = UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPad; zweven bannerHeight = ipad? 66.0f: 64.0f; // GC-banner heeft hoogte 66 op iPad, 64 op iPhone als ([windows count] > origWindowCount) {
NSLog (@ "suppressGCBanner: extra venster gevonden, testen"); UIWindow * window = [windows objectAtIndex: 1]; // bij mijn testen staat de GC-banner altijd op index 1 voor (UIView * view in [window subviews]) {CGRect frame = view.frame; NSLog (@ "subview grootte:% f,% f", frame.size.width, frame.size.height); if (frame.size.height! = bannerHeight) doorgaan; voor (UIView * subview in [view subviews]) {CGRect frame = subview.frame; NSLog (@ "sub-subview grootte:% f,% f", frame.size.width, frame.size.height); if (frame.size.width == 42.0f && frame.size.height == 42.0f) {// Game Center-pictogram is 42x42 NSLog (@ "GameCenter-banner gevonden: hiding. iter =% i", iter); window.alpha = 0.0f; // maak het raam onzichtbaar! terugkeren; }}}} if (++ iter > 200) {NSLog (@ "suppressGCBanner: timeout, bailing"); terugkeren; } // ____ anders recurse [self performSelector: @selector (suppressGCBanner :) withObject: nil afterDelay: 0.02f];}
Af en toe zie je een enkele pixel lijn flikkeren bovenaan het scherm voordat de banner wordt verborgen, maar over het algemeen lijkt deze methode goed genoeg te werken. Gebruik op eigen risico en geniet ervan!