斯威夫特的iAd - ADBannerView预警和CGAffineTransformInver

2019-05-10 10:58发布

所以,我想建立一个简单的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
}

Answer 1:

问题是每次加载你的观点,你正在创建一个新的实例时ADBannerView 。 我们需要做的是创建一个ADBannerView在我们的一次AppDelegate.swift然后出示此ADBannerView上有史以来的意见,我们希望有一个iAd的横幅。 这也被称为共享iAd的横幅 。 在这个例子中,我创建了一个ADBannerViewAppDelegate.swift ,然后将其添加到我的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)以前添加的功能。 如果你点击旗帜,然后把它打发掉这个函数会被调用,并从我们的观点删除我们的旗帜和设置我们的旗帜授予等于零太快会导致一些问题。



Answer 2:

如果你不想关心的大小,位置,错误处理和您的横幅广告,你也可以使用的委托方法:

self.canDisplayBannerAds = true

这解决了错误在我的应用程序,因为苹果需要还在乎实例的数量

我已经写了这个简短的教程: 链接



Answer 3:

如果你想在旗帜和标签之间仍然存在不消失的时候快速切换标签,你必须做的iAd套房方法: http://developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/ Intro.html (查看BannerViewController.m文件-而不是斯威夫特,但它不是很难将它转换)

这种方法也并不要求您修改任何走你的选项卡中的视图控制器。 您只需从你的标签栏控制器具有嵌入到其容器视图视图控制器都有关系SEGUE。 这样做,在你的故事板。 此外,您还需要自定义类设置为BannerViewController每个标签,和嵌入自己的内容放到内嵌视图。 看看这个职位上如何做到这一点的细节它的情节提要: https://stackoverflow.com/a/16205420/5007500

如果你不使用故事板 - 你需要设置BannerViewController为每个标签页父视图控制器。



文章来源: Swift iAd - More than 10 instances of ADBannerView warning and CGAffineTransformInvert: singular matrix output