0

I wanted to place a banner in drawRect UIView, but it gives warning at line 'bannerView.rootViewController = self'. So I placed the banner in it's viewController. and I want the value in drawRect to change the banner's position. The value can be printed out, but the banner reject to move. Here is the codes:

ViewController:

class ViewController: UIViewController, GADBannerViewDelegate,ChangeBannerDelegate 

    // var bannerView:GADBannerView!  // shows nil when run func changeBanner(), has to use the following
    var  bannerView = GADBannerView(adSize: kGADAdSizeBanner) 

    override func viewDidLoad() {
        super.viewDidLoad()

        waveView = WaveWater(frame: self.view.bounds)
        bannerView = GADBannerView(adSize: kGADAdSizeBanner)
        bannerView.frame = CGRect(x: 0, y: self.view.bounds.height-50, width: self.view.bounds.width, height: 50)
        bannerView.adUnitID = "xxxxxxxxxxxx"
        bannerView.rootViewController = self
        bannerView.delegate = self

        self.view.addSubview(bannerView)
        bannerView.loadRequest(GADRequest())

        // set other things...
    }

    func changeBanner(y:CGFloat){

        bannerView.frame.origin.y = y
        println(bannerView.frame.origin.y) // can print 'y', and banner.frame.origin.y was changed, but banner stays where it is

    }

UIView:

protocol ChangeBannerDelegate:NSObjectProtocol,GADBannerViewDelegate{

    func changeBanner(y:CGFloat)

}

class WaveWater: UIView, UIGestureRecognizerDelegate {

    var bannerDelegate:ChangeBannerDelegate?
    override init(frame: CGRect) {

        super.init(frame: frame)

        self.bannerDelegate = ViewController()
        changeBanner(50) // place it here just for a try
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func drawRect(rect: CGRect) {
        //drawing things........
    }
}
4

1 回答 1

1

您正在将bannerDelegateof视图设置为方法中WaveWater的新实例:ViewControllerinit(frame:)

self.bannerDelegate = ViewController()

它应该设置为您已经拥有的视图控制器的实例,最好的地方是在您创建视图之后viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

    waveView = WaveWater(frame: self.view.bounds)
    waveView.bannerDelegate = self

    ...
}
于 2015-09-11T06:20:06.297 回答