【问题标题】:Swift iAd - More than 10 instances of ADBannerView warning and CGAffineTransformInvert: singular matrix outputSwift iAd - 超过 10 个 ADBannerView 警告和 CGAffineTransformInvert 实例:奇异矩阵输出
【发布时间】:2015-02-14 10:41: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
}

【问题讨论】:

  • 每次加载视图时,您都会创建一个新的“ADBannerView”。您是否只加载此视图一次?
  • 这么想,没有这个视图被加载了很多次。你会推荐什么?有没有办法卸载 ADBannerView 或者有更好的方法吗?

标签: ios swift iad adbannerview


【解决方案1】:

问题是每次加载视图时都会创建ADBannerView 的新实例。我们需要做的是在我们的AppDelegate.swift 中创建一个ADBannerView,然后展示这个ADBannerView,在我们希望有一个iAd 横幅的任何视图上。这也称为Shared iAd Banner。在这个例子中,我在我的AppDelegate.swift 中创建了一个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) 函数中删除代码。如果您单击横幅然后将其关闭,则会调用此函数并从我们的视图中删除我们的横幅并将我们的横幅委托设置为 nil 太快会导致问题。

【讨论】:

  • 非常感谢!这非常有效,是一个巨大的帮助:)
  • 您确定这与 appDelegate 中的横幅实例相同吗?不确定我是否正确获取了这个共享横幅实例,但看起来很奇怪的行是“self.appDelegate.adBannerView = ADBannerView(frame: CGRect.zeroRect)”。这是一个初始化程序,因此您创建了一个不同的对象。
  • @krompir2 感谢您指出这一点。我重新实现了ADBannerView 并为 Swift 2.0 更新了它。
  • @DanielStorm 奇怪,但它使我的应用程序崩溃并说这是因为bannerViewDidLoadAd 功能
  • @Burundanga 确保在项目中包含 iAd.framework,构建阶段>将二进制文件与库链接>单击 + 以搜索并包含框架。还要确保您已将ADBannerView 的代表包含在您的AppDelegate.swiftADBannerViewDelegate 中。
【解决方案2】:

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

self.canDisplayBannerAds = true

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

我为此写了一个简短的教程: link

【讨论】:

    【解决方案3】:

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

    这种方法也不需要您修改选项卡中的任何视图控制器。您只需要将标签栏控制器与嵌入了容器视图的视图控制器建立关系。在你的故事板中做到这一点。此外,您需要为每个选项卡设置自定义类为 BannerViewController,并将您的内容嵌入到嵌入式视图中。看看这篇文章,详细了解如何在 Storyboard 中做到这一点:https://stackoverflow.com/a/16205420/5007500

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

    【讨论】:

      猜你喜欢
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多