Swift iAd – 超过10个ADBannerView警告实例和CGAffineTransformInvert:奇异matrix输出

所以我试图在我的应用程序中设置一个简单的iAd横幅,但是我在输出中得到了这两个警告:

WARNING: More than 10 instances of ADBannerView or ADInterstitialView currently exist. This is a misuse of the iAd API, and ad performance will suffer as a result. This message is printed only once. 

 <Error>: CGAffineTransformInvert: singular matrix. 

这是我用来实现我的ADBannerView

 var adBannerView = ADBannerView() func loadAds() { adBannerView = ADBannerView(frame: CGRect.zeroRect) adBannerView.center = CGPoint(x: adBannerView.center.x, y: view.bounds.size.height - adBannerView.frame.size.height / 2) adBannerView.delegate = self adBannerView.hidden = true view.addSubview(adBannerView) } //BannerView did load ad func bannerViewDidLoadAd(banner: ADBannerView!) { adBannerView.hidden = false } //BannerView failed to load func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) { adBannerView.hidden = true } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. loadAds() //(rest of the code is from here onwards) 

我试图添加这个停止第一个错误:(没有工作)

 //BannerView will disappear override func viewWillDisappear(animated: Bool) { adBannerView.removeFromSuperview() adBannerView.delegate = nil } 

问题是每当你加载你的视图,你正在创build一个新的ADBannerView实例。 我们需要做的是在我们的AppDelegate.swift创build一个ADBannerView ,然后展示这个ADBannerView在这个视图上我们希望有一个iAd ADBannerView 。 这也被称为共享的iAd横幅 。 在这个例子中,我在AppDelegate.swift创build了一个ADBannerView ,然后将其添加到ViewController.swift的视图中。

AppDelegate.swift

 import UIKit import iAd // Import iAd @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, ADBannerViewDelegate { // Include the delegate for our banner var window: UIWindow? var adBannerView = ADBannerView() // Create our one ADBannerView func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Set delegate and hide banner initially adBannerView.delegate = self adBannerView.hidden = true return true } func bannerViewDidLoadAd(banner: ADBannerView!) { print("bannerViewDidLoadAd") adBannerView.hidden = false } func bannerViewActionDidFinish(banner: ADBannerView!) { print("bannerViewActionDidFinish") } func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) { print("didFailToReceiveAdWithError: \(error)") adBannerView.hidden = true } 

ViewController.swift

 import UIKit class ViewController: UIViewController { let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate // Create reference to our app delegate override func viewWillAppear(animated: Bool) { // Position appDelegate.adBannerView.center = CGPoint(x: view.frame.midX, y: view.frame.height - appDelegate.adBannerView.frame.height / 2) // Add to view view.addSubview(appDelegate.adBannerView) } 

不要忘记从您之前添加的viewWillDisappear(animated: Bool)函数中删除代码。 如果你点击横幅,然后解雇它,这个函数将被调用,并从我们的视图中删除我们的横幅,并设置我们的横幅委托等于零太快会导致问题。

如果您不想关心横幅广告的大小,位置,error handling和委托方法,您还可以使用:

 self.canDisplayBannerAds = true 

这解决了我的应用程序中的错误,因为苹果也关心实例的数量

我写了一个关于这个链接的简短教程

如果您希望横幅在标签之间保持不变,并且在快速切换标签时不会消失,则必须执行iAd Suite方法: http : //developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/ Intro.html (查看BannerViewController.m文件 – 不是在Swift中,但不难转换)

这种方法也不要求你修改你的标签中的视图控制器。 您只需将标签栏控制器中的某个关系从一个视图控制器中embedded一个容器视图即可。 在你的故事板中做到这一点。 此外,您需要为每个选项卡将Custom Class设置为BannerViewController,并将您的内容embedded到embedded式视图中。 看看这篇文章的细节如何做到这一点故事板: https : //stackoverflow.com/a/16205420/5007500

如果您没有使用Storyboard,则需要将BannerViewController设置为每个选项卡的父视图控制器。

Interesting Posts