Frage Swift iAd - Mehr als 10 Instanzen von ADBannerView warning und CGAffineTransformInvert: singular matrix output


Also versuche ich, ein einfaches iAd-Banner in meiner Anwendung einzurichten, aber ich bekomme diese zwei Warnungen in der Ausgabe:

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.

und

<Error>: CGAffineTransformInvert: singular matrix.

Dies ist, was ich verwende, um meine zu implementieren 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)

Ich habe versucht, dies hinzuzufügen, um den ersten Fehler zu stoppen: (hat nicht funktioniert)

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

9
2018-02-14 10:41


Ursprung


Antworten:


Das Problem tritt auf, wenn Sie Ihre Ansicht laden, wenn Sie eine neue Instanz erstellen ADBannerView. Was wir tun müssen, ist ein ADBannerView einmal in unserem AppDelegate.swift und dann präsentiere dies ADBannerView Auf welchen Ansichten wir auch immer ein iAd Banner haben möchten. Dies nennt man auch a Gemeinsam genutztes iAd-Banner. In diesem Beispiel habe ich ein erstellt ADBannerView in meinem AppDelegate.swift und fügte es dann meiner hinzu ViewController.swift's Ansicht.

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)
    }

Vergessen Sie nicht, den Code von Ihrem zu entfernen viewWillDisappear(animated: Bool) Funktion, die Sie zuvor hinzugefügt haben. Wenn Sie auf das Banner klicken und es dann ablehnen, wird diese Funktion aufgerufen und unser Banner wird aus unserer Sicht entfernt. Wenn Sie unseren Banner-Delegaten gleich zu Null setzen, wird dies zu Problemen führen.


18
2018-02-20 22:18



Wenn Sie sich nicht um die Größe, Position, Fehlerbehandlung und die Delegiertenmethoden Ihrer Bannerwerbung kümmern möchten, können Sie auch Folgendes verwenden:

self.canDisplayBannerAds = true

Dies löste den Fehler in meiner App, denn Apple kümmert sich auch um die Anzahl der Instanzen

Ich habe ein kurzes Tutorial dazu geschrieben: Verknüpfung


1
2017-07-07 20:47



Wenn Sie möchten, dass das Banner zwischen den Registerkarten verbleibt und nicht verschwindet, wenn Sie schnell Tabs wechseln, müssen Sie den iAd Suite-Ansatz verwenden: http://developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/Intro.html (Sehen Sie sich die Datei BannerViewController.m an - nicht in Swift, aber es ist nicht schwer, sie zu konvertieren)

Bei diesem Ansatz müssen Sie auch nicht die View-Controller in Ihren Tabs ändern. Sie müssen lediglich eine Beziehung zwischen Ihrem Tab-Controller und einem View-Controller haben, in den die Container-Ansicht eingebettet ist. Mach das in deinem Storyboard. Außerdem müssen Sie für jede Registerkarte die benutzerdefinierte Klasse zu BannerViewController festlegen und Ihren Inhalt in die eingebettete Ansicht einbetten. Schaut euch diesen Post an, um Details darüber zu erfahren, wie es im Storyboard funktioniert: https://stackoverflow.com/a/16205420/5007500

Wenn Sie kein Storyboard verwenden, müssen Sie BannerViewController als übergeordneten Ansichtscontroller für jede Registerkarte festlegen.


1
2018-03-22 15:51