ios - opuesta - matriz rectangular
Swift iAd: más de 10 instancias de advertencia ADBannerView y CGAffineTransformInvert: salida de matriz singular (3)
Así que estoy tratando de configurar un banner de iAd simple en mi aplicación, pero recibo estas dos advertencias en la salida:
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.
y
<Error>: CGAffineTransformInvert: singular matrix.
Esto es lo que estoy usando para implementar mi
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)
Intenté agregar esto para detener el primer error: (no ha funcionado)
//BannerView will disappear
override func viewWillDisappear(animated: Bool) {
adBannerView.removeFromSuperview()
adBannerView.delegate = nil
}
El problema es que cada vez que carga su vista está creando una nueva instancia de
ADBannerView
.
Lo que debemos hacer es crear un
ADBannerView
una vez en nuestro
AppDelegate.swift
y luego presentar este
ADBannerView
en las vistas en las que nos gustaría tener un banner de iAd.
Esto también se llama un
banner de iAd compartido
.
En este ejemplo, creé un
ADBannerView
en mi
AppDelegate.swift
y luego lo agregué a la vista de mi
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)
}
No olvide eliminar el código de su función
viewWillDisappear(animated: Bool)
que agregó anteriormente.
Si hace clic en el banner y luego lo descarta, se llamará a esta función y eliminar nuestro banner de nuestra vista y establecer nuestro delegado de banners igual a nulo demasiado pronto causará problemas.
Si desea que el banner persista entre las pestañas y no desaparezca al cambiar rápidamente de pestañas, debe seguir el enfoque de iAd Suite: http://developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/Intro.html (consulte el archivo BannerViewController.m, no en Swift, pero no es difícil convertirlo)
Este enfoque tampoco requiere que modifiques ninguno de los controladores de vista dentro de tus pestañas. Simplemente debe tener una relación entre el controlador de la barra de pestañas y un Controlador de vista que tenga una vista de contenedor integrada. Haz eso en tu guión gráfico. Además, debe configurar la Clase personalizada en BannerViewController para cada pestaña e incrustar su contenido en la vista incrustada. Eche un vistazo a esta publicación para obtener detalles sobre cómo hacerlo en el Guión gráfico: https://.com/a/16205420/5007500
Si no está utilizando Storyboard, debe configurar BannerViewController como controlador de vista principal para cada una de sus pestañas.
Si no desea preocuparse por el tamaño, la posición, el manejo de errores y los métodos delegados de su anuncio publicitario, también puede usar:
self.canDisplayBannerAds = true
Esto resolvió el error en mi aplicación, porque Apple también se preocupa por la cantidad de instancias
He escrito un breve tutorial sobre esto: link