我将 ADBannerView 添加到视图中,当我加载应用程序时,我收到以下消息:
ADBannerView:警告横幅视图 (0x7a023c0) 有广告,但可能会被遮挡。此消息仅在每个横幅视图中打印一次。
据我所知,整个横幅都在屏幕上可见。这真的是个问题吗?或者它只是一个我可以忽略的警告?
正如 Stephen Darlington 所说,找出问题所在是个好主意。在代码中(从视图控制器)仔细检查这一点的一种简单方法是:
// bring your bannerView to the front
[self.view bringSubviewToFront:bannerView];
// and make sure it's positioned onscreen.
bannerView.frame = CGRectMake(0.0, 0.0, bannerView.frame.size.width, bannerView.frame.size.height);
假设您的 AdBannerView 有一个名为 bannerView 的 iVar / IBOutlet,这将解决任何界面构建器定位问题,并确保bannerView 没有被任何东西覆盖。
根据我的经验,如果广告不在屏幕上,没有什么不好的事情发生,但是,iAd 在知道它完全在屏幕上之前不会加载新广告。所以,当你启动你的应用程序时,
您的 AdBannerView 将尝试加载广告,无论它是否在屏幕上。
根据是否成功,您的 AdBannerViewDelegate 将收到
a)bannerViewDidLoadAd:(继续第 3 步)或
b)bannerView:didFailToReceiveAdWithError:(AdBannerView 将自行重试)
那时,球就在你的球场上,如果实际上它确实加载了广告,那么如何处理所述横幅视图。在代码中检查这一点的一种简单方法是 yourBannerView.bannerLoaded,如果它有广告,它将返回 YES,如果没有,它将返回 NO。所以...
在 AdBannerView 成功加载其初始广告后,您如何处理它决定了它在未来的行为方式。您不必立即将它放在屏幕上——选择在您的应用程序中有意义的时间。但是,已成功加载广告的横幅视图将不会尝试加载另一个广告,直到它出现在屏幕上。(有道理,对吧?)棘手的部分是......
4b)您也不会从该bannerView获得任何新的委托消息,因此如果您在收到bannerViewDidLoadAd委托消息后没有立即在屏幕上移动bannerView,您必须自己实现某种控制结构来处理当您确实将其移到屏幕上时,它将开始向广告服务器请求更多广告,并且您将收到更多委托消息,并且循环重新开始。
因此,总结一下:如果您想提供更多 iAd 并获得报酬,那么只有当您的 iAd 被遮盖时才会出现问题。但是,最近 eCPM 一直非常非常低,所以也许这毕竟不是这样的问题 ;)
为了加入这个讨论,当我修改center
属性以将广告移动到屏幕外时,我收到了这条消息。我使用 UIView 动画将广告滑到屏幕上。
经过一些试验,我想出了如何在不导致出现消息的情况下做到这一点。adBannerView.hidden
诀窍是在等待广告加载时隐藏以将属性设置为 YES。加载后,我只需要确保仅在提交动画后将隐藏属性设置为 NO:
-(void) fadeAdIn:(UIView*)view
{
float offsetY = view.frame.size.height * (bannerOnBottom ? 1 : -1);
CGPoint pos = [self getBannerPosition];
view.center = CGPointMake(pos.x, pos.y + offsetY);
[UIView beginAnimations:@"AdIn" context:nil];
[UIView setAnimationDuration:1.0];
view.center = pos;
[UIView commitAnimations];
// must unhide AFTER animation has been committed to prevent "ad obstructed"
view.hidden = NO;
}
就像编译器警告一样,我认为即使它不会立即引起问题,您也应该尝试深入了解它。如果我是 Apple,我会将我的广告发送到实际展示它们的应用程序(我不是说他们这样做),因此也可能存在财务方面的问题。
我见过的几个问题:
LearnCocos2D 的答案是我的解决方案。不确定这是否是 Cocos2D(我正在使用)的特定问题。我的问题是我使用 Apple 推荐使用的块使用“新”样式动画, animateWithDuration:delay:options:animations:completion: 当我使用这些时,我得到了模糊的警告。我想问题是视图在动画时被部分遮挡,因此会发出警告,但显然,在它完成动画之前你不能让它完全可见,除非你只是想在屏幕上弹出它,这很难看。
没关系,因为使用 beginAnimations: 和 commitAnimations: 切换回“旧”样式动画确实消除了我的警告。我很好奇这个警告是否意味着您实际上错过了广告收入,或者它只是烦人但实际上不是问题。
我遇到了同样的问题,但原因是我在上面有 OpenFeint 通知栏,例如高分,成就解锁等。它滑入然后滑出,不会停留很长时间,所以我不认为它是一个问题。
如果您将 ADS 放在顶部,那么用户将看不到 OpenFeint 通知,这将是另一个问题,我不知道如果您在屏幕的不同位置有 ADS 和 OpenFeint 是否会发生这种情况,我没有尝试将其作为我的应用程序的底部屏幕上到处都是按钮,因此只有屏幕顶部可用。
另一种选择是监听状态栏调整大小事件并在发生这种情况时移动 iAd,以便它不会重新定位到屏幕外(导致该警告并且没有提供的广告)。
在您的应用程序委托中,点击此功能:
当我将 ADBannerView 添加到 UIScrollView 时,我收到此消息。在这种情况下,广告可能会被遮挡。
我有这样的代码:
if (animate)
{
[UIView animateWithDuration:0.5 animations:^{
self.adBannerView.frame = adBannerFrame;
self.otherViewFrame.frame = otherViewFrame;
}
];
}
else
{
self.adBannerView.frame = adBannerFrame;
self.otherViewFrame.frame = otherViewFrame;
}
经过一些试验,我发现初始化的顺序应该在 if 和 else 腿中颠倒。
self.otherViewFrame.frame = otherViewFrame;
self.adBannerView.frame = adBannerFrame;
所以这个想法是不要让另一个视图覆盖 AdBannerView,即使是几微秒。