2016-06-10 5 views
2

Ich arbeite mit dem Google Mobile Ads SDK auf iOS und versuche, einige Anzeigen anzuzeigen. Mein Code:GADBannerView Delegate-Methoden nicht aufgerufen, wenn die Ansicht nicht in der Ansichtshierarchie ist

GADBannerView* bannerView = [[GADBannerView alloc] initWithAdSize:GADAdSizeFromCGSize(CGSizeMake(300, 250))]; 
bannerView.adUnitID = @"hidden"; 
bannerView.rootViewController = self; 
bannerView.delegate = self; 

GADRequest* request = [GADRequest request]; 
request.testDevices = @[ kGADSimulatorID ]; 

[bannerView loadRequest:request]; 

Dies funktioniert gut, wenn ich die bannerView der Ansicht Hierarchie direkt nach dem Code hinzufügen, sehen Sie oben. Allerdings möchte ich es nicht wirklich hinzufügen, bis die Anzeige geladen ist, also wollte ich es verzögern. Ich habe festgestellt, dass wenn die bannerView nicht in der View-Hierarchie ist, die Delegate-Methoden überhaupt nicht aufgerufen werden. Außerdem habe ich this answer gefunden, was im Einklang mit dem steht, was ich beobachte. Auf der anderen Seite ist dies ein Zitat aus dem GADBannerViewDelegate Header:

/// Tells the delegate that an ad request successfully received an ad. The delegate may want to add 
/// the banner view to the view hierarchy if it hasn't been added yet. 
- (void)adViewDidReceiveAd:(GADBannerView *)bannerView; 

Dies legt nahe, dass es möglich sein soll, diese Delegierten Rückrufe auch wenn die Aussicht ist nicht in der Hierarchie zu erhalten, das ist genau das, was ich will. Also, irgendwelche Ideen wie könnte ich das erreichen?

+0

Sie haben '' GADBannerViewDelegate'' zu Ihrem 'ViewController' hinzugefügt, richtig? Zum Beispiel '@interface ViewController() '. –

+1

@Daniel Ja, ich habe meinen View-Controller zur Implementierung des Protokolls erklärt und erhalte keine Warnungen. – lawicko

Antwort

5

Ok, so das Problem hier war, dass ich nicht den Verweis auf die bannerView gehalten habe. Die Zuordnung wurde aufgehoben, nachdem die Methode zurückgegeben wurde. Deshalb wurden die Delegate-Methoden nicht aufgerufen.

0

Sie sollten die GADBannerView zu Ihrer Ansicht hinzufügen und ihre versteckte Eigenschaft zunächst auf YES setzen. Außerdem würde ich vorschlagen, AdSize Constant kGADAdSizeBanner zu verwenden, das von AdMob bereitgestellt wird. Hier ist eine Liste von zusätzlichen AdSize Constants.

Zum Beispiel:

bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner]; 
bannerView.adUnitID = @"YourAdUnitID"; 
bannerView.rootViewController = self; 
bannerView.delegate = self; 
[bannerView loadRequest:[GADRequest request]]; 
bannerView.hidden = YES; // Hide banner initially 
[self.view addSubview:bannerView]; 
// This will put the banner at the bottom of the screen and stretch to fit the screens width 
[bannerView setFrame:CGRectMake(0, self.view.frame.size.height - bannerView.frame.size.height, self.view.frame.size.width, bannerView.frame.size.height)]; 

Dann, wenn Sie eine Anzeige erhalten blenden Sie das Banner. Zum Beispiel:

-(void)adViewDidReceiveAd:(GADBannerView *)adView { 
    // We've received an ad so lets show the banner 
    bannerView.hidden = NO; 
    NSLog(@"adViewDidReceiveAd"); 
} 

-(void)adView:(GADBannerView *)adView didFailToReceiveAdWithError:(GADRequestError *)error { 
    // Failed to receive an ad from AdMob so lets hide the banner 
    bannerView.hidden = YES; 
    NSLog(@"adView:didFailToReceiveAdWithError: %@", [error localizedDescription]); 
} 

könnten Sie animieren auch diese, wenn Sie es vorziehen würden, durch die Banner der Einstellung alpha Eigenschaft auf 0.0 zunächst anstelle der Verwendung es hidden Eigenschaft ist. Animieren Sie dann die alpha, wenn Sie eine Anzeige erhalten. Zum Beispiel:

-(void)adViewDidReceiveAd:(GADBannerView *)adView { 
    // We've received an ad so lets fade in the banner 
    [UIView animateWithDuration:0.2 animations:^{ 
     bannerView.alpha = 1.0; 
    }]; 
    NSLog(@"adViewDidReceiveAd"); 
} 

-(void)adView:(GADBannerView *)adView didFailToReceiveAdWithError:(GADRequestError *)error { 
    // Failed to receive an ad from AdMob so lets fade out the banner 
    [UIView animateWithDuration:0.2 animations:^{ 
     bannerView.alpha = 0.0; 
    }]; 
    NSLog(@"adView:didFailToReceiveAdWithError: %@", [error localizedDescription]); 
} 

Auch als eine Randnotiz ist die GADBannerView transparent, wenn keine Anzeige dort angezeigt ist. Es würde also auch funktionieren, wenn du es zu deiner Ansicht hinzufügst und nichts anderes tust.

+0

Danke für die Antwort, aber ich möchte die Ansicht nicht der Hierarchie hinzufügen, in der Tat möchte ich es um jeden Preis vermeiden, weil dieses Banner eine Zelle in der Sammlungsansicht ist, also wenn es nicht geladen ist, ich ' interessiert mich nicht. Außerdem ist die Größe auf 300x250 festgelegt, so dass die Größenkonstanten für mich keinen Nutzen haben. 300x250, oder so genanntes Medium Rectangle, ist ziemlich populär, deshalb mache ich mir keine Sorgen über fehlende Anzeigen. – lawicko

+0

@lawicko Mein Vergnügen. Sie sollten Ihre Frage bearbeiten, um diese Informationen aufzunehmen. –

+0

Sie erwähnten, dass die Banneransicht "Sollte" anfänglich in der Ansichtshierarchie sein sollte. In den SDK-Dokumenten wird eindeutig angegeben, dass Sie dies anfordern können, bevor Sie sie der Hierarchie hinzufügen. –

Verwandte Themen