Программное изменение позиции iAd в Swift

У меня есть рамка iAd среднего размера (300 x 250), которую я хочу разместить по центру. Позвольте мне сначала сказать, что я вставил его прямо в контроллер представления, запустил симулятор, и он не обнаружил никаких проблем. Затем я добавил автоматические ограничения для центрирования по горизонтали и вертикали. В предварительном просмотре раскадровки это сработало, но когда я запустил его в реальном симуляторе, рекламы нигде не было. Я вывел сообщение об успехе, поэтому оно загрузилось и все такое, но не появилось. Удаление ограничений исправило это.

Поэтому я попытался сделать это программно. Я создал необходимые делегаты и все такое, и код, который я вижу, как это сделать, очень похож на другие, поэтому я понятия не имею, почему это не работает. Независимо от того, какие значения я добавляю в CGRect, реклама везде выглядит одинаково.

Код:

import UIKit
import iAd

class replayAdViewController: UIViewController, ADBannerViewDelegate {

@IBOutlet var bannerView: ADBannerView!



override func viewDidLoad() {
    super.viewDidLoad()

    bannerView!.delegate = self
}

func bannerViewDidLoadAd(banner: ADBannerView!)
{
    println("success, banner loaded")

    var width = self.view.frame.width
    var height = self.view.frame.height

    banner.frame = CGRectMake(width, height, 300, 250)

    self.view.addSubview(banner) //Add banner to view (Ad loaded)
}

func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError
    error: NSError!)
{
        println("failed to load ad, removed")
        println(error)
        //banner.removeFromSuperview() //Remove the banner (No ad)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

Я попытался переместить оператор CGRect из функции в viewDidLoad и использовать bannerView.frame и т. д. Я предполагаю, что каким-то образом связываю баннер со свойствами CGRect или что-то неправильно, но ошибок нет, поэтому я не не знаю. Также я не понимаю, почему автоматические ограничения портят его только вертикальным и горизонтальным центром, но решение любой проблемы действительно помогло бы мне.

Спасибо.


person CodeMark22    schedule 19.08.2015    source источник
comment
Я также понимаю, что для центрирования это должны быть высота и ширина, разделенные на 2, но эта часть не имеет значения, поскольку независимо от того, что я туда вставил, положение останется прежним.   -  person CodeMark22    schedule 19.08.2015


Ответы (2)


Предполагая, что ваши торговые точки настроены правильно, вы должны расположить рекламу в didMoveToView следующим образом: bannerView.center = self.view.center Кроме того, в didFailToReceiveAdWithError будет лучше, если вы скроете баннер: bannerView.hidden = true. Вам не обязательно иметь эту строку self.view.addSubview(banner), потому что вы добавляете баннер в представление в раскадровке. Размер баннера также можно установить в раскадровке с помощью ограничений.

person TheCodeComposer    schedule 19.08.2015

Спасибо за ответ как таковой. Тем не менее, я нашел решение. Отбросил все ограничения, и после добавления делегата Ad я просто использовал код для создания и перемещения объявления следующим образом:

var adView = ADBannerView(adType: ADAdType.MediumRectangle)

override func viewDidLoad() {
    super.viewDidLoad()



    adView.frame = CGRectZero
    adView.delegate = self
    adView.frame = CGRectMake(0, 0, self.adView.frame.size.height, self.adView.frame.size.width)

    adView.center = CGPoint(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 2)

    self.view.addSubview(adView) }

Не совсем уверен, где что-то пошло не так с самого начала. Я попытался создать кнопку с помощью розетки и переместить ее в viewDidLoad, которая также начала не работать, но я решил это, выполнив код позиционирования в viewDidLayoutSubviews... так что, возможно, если я создаю розетку И использую код для ее перемещения, Я должен использовать именно этот метод, а не viewDidLoad. Возможно, это была ошибка, но в любом случае это было решением.

person CodeMark22    schedule 20.08.2015