2016-09-10 4 views
1

Ich habe eine Banneransicht und möchte eine benutzerdefinierte Schließen-Schaltfläche haben. Mein Problem ist, dass die Schaltfläche angezeigt wird, bevor die Anzeige geladen und angezeigt wird.So verwenden Sie GADBannerViewDelegate, um eine Aktion für adViewDidReceiveAd auszuführen

class RootVC: UIViewController, GADBannerViewDelegate { 

    var googleAdBanner: GADBannerView! 
    var googleBannerCloseBtn: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     googleAdBanner = GADBannerView(frame:CGRectMake(0,0,100,100)) 
     googleAdBanner.center = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2) 
     googleAdBanner.adUnitID = "xx" 
     googleAdBanner.rootViewController = self 
     googleAdBanner.loadRequest(GADRequest()) 
     adViewWillPresentScreen(googleAdBanner) 
     googleAdBanner.delegate = self 
     self.view.addSubview(googleAdBanner) 
    } 

    func adViewWillPresentScreen(bannerView: GADBannerView!) { 
     googleBannerCloseBtn = UIButton(frame: CGRectMake(5 , 5, 25, 25)) 
     googleBannerCloseBtn.backgroundColor = UIColor.clearColor() 
     googleBannerCloseBtn.setImage(UIImage(named: "closeBtn"), forState: .Normal) 
     googleBannerCloseBtn.setTitle("Click Me", forState: UIControlState.Normal) 
     googleBannerCloseBtn.addTarget(self, action: #selector(RootVC.buttonAction(_:)), forControlEvents: UIControlEvents.TouchUpInside) 
     googleBannerCloseBtn.tag = 1 
     googleAdBanner.addSubview(googleBannerCloseBtn) 
    } 

Wie kann ich den Knopf nur vor, wenn die GADBannerView eine Anzeige geladen ist und dargestellt wird?

Gleiches Verhalten mit adViewDidReceiveAd. Die Schaltfläche ist sichtbar, auch wenn die GADBannerView "unsichtbar" ist, da derzeit keine Anzeige geladen ist.

Bildschirme wie angefordert. Wie Sie sehen, wird die Schaltfläche, dh subView der GADBannerView angezeigt, bevor die Anzeige selbst angezeigt wird.

enter image description here enter image description here

+0

Können Sie einen Screenshot zu Ihrer Frage hinzufügen, was die Schließen-Schaltfläche aussieht, wenn zu 'GADBannerView' hinzugefügt. Brauchen Sie eine bessere Vorstellung von dem, was Sie beschreiben. –

+0

@DanielStorm Bildschirme hinzugefügt –

+0

Ich bin weg von meinem Computer atm, aber werde später darauf schauen. Noch eine Frage. Möchten Sie eine Vollbild-Interstitial-Anzeige oder eine Banner-Anzeige am unteren Rand der Ansicht? Mit einem Banner wie du bist ist ein wenig unorthodox. Ein Interstitial, "GADIntersitial", ist eine Vollbildanzeige, zahlt normalerweise mehr und verfügt über eine eigene Schaltfläche zum Schließen. –

Antwort

1

Ich habe in diesem Beispiel eine Menge von der Logik als Kommentar gekennzeichnet. Das einzige, was ich nicht erwähnt habe, ist, dass Sie zwei Anzeigenblock-IDs erstellen müssen. Eine für Ihre GADBannerView und eine für Ihre GADInterstitial auf AdMob.com.

import UIKit 
import GoogleMobileAds // Import AdMob 

class ViewController: UIViewController, GADBannerViewDelegate, GADInterstitialDelegate { // Include our delegates 

    // Create our ads 
    var banner = GADBannerView(adSize: kGADAdSizeBanner) // kGADAdSizeBanner is a default banner size 
    var interstitial = GADInterstitial(adUnitID: "YourInterstitialAdUnitID") 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // View has loaded so lets setup our ads initially 
     setupAds() 
    } 


    // MARK: - Setup Ads 
    func setupAds() { 
     // Setup our banner ad 
     banner.adUnitID = "YourBannerAdUnitID" 
     banner.rootViewController = self 
     banner.delegate = self 
     // Hide our banner initially until it loads an ad 
     // Not doing this is why your close button was visible 
     // GADBannerView's with no ad are essentially "clear", not hidden 
     banner.alpha = 0.0 
     banner.loadRequest(GADRequest()) 
     // Position banner on bottom of view 
     banner.frame = CGRect(x: 0.0, 
           y: view.frame.height - banner.frame.height, 
           width: view.frame.width, 
           height: banner.frame.height) 
     // Create your button here and add it as a subview to banner 
     // banner.addSubview(closeButton) 
     view.addSubview(banner) 

     // Setup our interstitial ad initially 
     interstitial.delegate = self 
     interstitial.loadRequest(GADRequest()) 
    } 


    // MARK: - Load Interstitial Ad 
    func loadFullScreenAd() { 
     // GADInterstitial's are single use. You have to create a new GADInterstitial for each presentation 
     // So, if you'd like to show more than one GADInterstitial in your apps session we need this 
     // This func will be used to create a new GADInterstitial after one has been displayed and dismissed 
     interstitial = GADInterstitial(adUnitID: "YourInterstitialAdUnitID") 
     interstitial.delegate = self 
     interstitial.loadRequest(GADRequest()) 
    } 


    // MARK: - Show Interstitial Ad 
    func showFullScreenAd() { 
     // Call this function when you want to present the interstitial ad 
     // ie. game over, transition to another vc, etc... 
     // Make sure you give atleast a few seconds for this ad to load before atempting to present it 
     // For example, don't try to present this ad in viewDidAppear 

     // Check if the interstitial ad is loaded before trying to present it 
     if interstitial.isReady { 
      interstitial.presentFromRootViewController(self) 
     } 
    } 


    // MARK: - Close Button Action 
    func closeButtonAction() { 
     // This is where we will handle your close button that you've added to your GADBannerView 
     // You can handle this two ways and it depends on what you'd like to do 
     // If you don't want to show the banner ad again during the entire app session you would hide the banner 
     // This way even if we change the alpha values in our delegate methods the banner will remain hidden 
     banner.hidden = true 

     // Another way you can handle the close button would be to hide the banner until another banner ad is loaded 
     // I believe the refresh rate for banner ads is 45-60 seconds. You can customize the refresh time on AdMob.com 
     // So, this way if the user tapped the close button the banner would fade out 
     // But, when another banner ad is loaded the banner would fade back in because of the code in our adViewDidReceiveAd delegate method 
     UIView.animateWithDuration(0.2) { 
      self.banner.alpha = 0.0 
     } 

     /////* Choose which way you'd like to handle the close button and remove the code for the other *///// 
    } 


    // MARK: - GADBannerView Delegate Methods 
    func adViewDidReceiveAd(bannerView: GADBannerView!) { 
     print("adViewDidReceiveAd") 
     // We received an ad so lets show it 
     // You could even fade in the banner if you'd like 
     UIView.animateWithDuration(0.2) { 
      self.banner.alpha = 1.0 
     } 
    } 

    func adView(bannerView: GADBannerView!, didFailToReceiveAdWithError error: GADRequestError!) { 
     print("banner didFailToReceiveAdWithError: \(error)") 
     // We received an error when trying to load our GADBannerView 
     // Lets hide it because we don't have an ad 
     // You could also fade this out if you'd like 
     UIView.animateWithDuration(0.2) { 
      self.banner.alpha = 0.0 
     } 
    } 


    // MARK: - GADInterstitial Delegate Methods 
    func interstitialDidReceiveAd(ad: GADInterstitial!) { 
     print("interstitialDidReceiveAd") 
    } 

    func interstitialWillPresentScreen(ad: GADInterstitial!) { 
     print("interstitialWillPresentScreen") 
     // If you needed to pause anything in your app this would be the place to do it 
     // ie. sounds, game state, etc... 
    } 

    func interstitialDidDismissScreen(ad: GADInterstitial!) { 
     print("interstitialDidDismissScreen") 
     // The GADInterstitial has been shown and dismissed by the user 
     // Lets load another one for the next time we want to show a GADInterstitial 
     loadFullScreenAd() 

     // If you paused anything in the interstitialWillPresentScreen delegate method this is where you would resume it 
    } 

    func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) { 
     print("interstitial didFailToReceiveAdWithError: \(error)") 
    } 
} 

Auch, wenn Sie auf die Präsentation der GADInterstitial oft in der Anwendung planen, würde ich empfehlen, für die Anzeigenblock-ID auf AdMob.com Video-Anzeigen deaktivieren. AdMob-Interstitial-Videoanzeigen deaktivieren die Schaltfläche zum Schließen für 5 Sekunden, ähnlich wie die Überspringen-Schaltfläche auf YouTube, und werden Ihre Nutzer sofort verärgern. Wenn Sie nur selten GADInterstitial zeigen, lasse ich die Videoanzeigen aktiviert.

enter image description here

+0

vielen Dank für Ihre Mühe. eine Folgefrage, ich bekomme: 'NSLocalizedFailureReason = Request Error: Keine Anzeige zu zeigen ' –

+0

Ich bekomme es auf der Interstitial, meine App-Unit-ID für das Interstitial ist sicher richtig. Ich habe ein w/o Video erstellt, wie Sie –

+0

gemäß http://stackoverflow.com/questions/25642492/dfp-issue-no-ad-to-show empfohlen haben, weil Breite/Höhe 0 ist. mögliches Problem? –

Verwandte Themen