我有一个使用 iAd 的 iPhone 应用程序,并回退到 AdMob 广告:
- (void)bannerViewDidLoadAd:(ADBannerView *)banner {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3f];
adBannerView.frame = CGRectMake(0, 410, 320, 50);
[UIView commitAnimations];
// hide the admob ad
if(adMobView != nil && adMobView.superview != nil) {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3f];
adMobView.frame = CGRectMake(0, 460, 320, 48);
[UIView commitAnimations];
}
}
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3f];
// hide banner
adBannerView.frame = CGRectMake(0, 460, 320, 50);
[UIView commitAnimations];
if(adMobView != nil && adMobView.superview != nil) {
[adMobView requestFreshAd];
} else {
adMobView = [AdMobView requestAdWithDelegate:self];
adMobView.frame = CGRectMake(0, 460, 320, 48);
[self.view addSubview:adMobView];
}
}
这在 iPhone 上运行良好。但是,当应用程序在 iPad 上运行时,这种情况会再次出现;(特别是对'self.view'的调用)根据ViewController.view 引用[self.view addSubview:adMobView];
调用 loadView ,它尝试再次布局 AdBannerView,这再次触发失败。
我认为这与 iPad 上的窗口边界比 iPhone 更大/不同,以及确定是否尝试加载 AdBanner 的规则有关。
一种解决方案可能是将我硬编码的边界调整为更远(因此超出 iPad 的更大范围)。另一种解决方案是完全避免 self.view 调用/递归风险并以另一种方式进行 - 但是,AdMobView 有点挑剔,并且真的希望被实例化requestAdWithDelegate
,如果我将它放在 viewDidLoad 中,这还为时过早。
哪种方法是明智的?