2

我没有设法让 iAd 在故事板中的 UITableViewController 中工作。

到目前为止,这基本上是我所做的:在故事板中,我在 UITableViewController 的场景底部拖动了一个 iAd 横幅视图。(我无法在视图本身中设置横幅,因为故事板阻止了它。我只能将 iAd 对象拖到第一响应者和 UITableViewController 的图标旁边。)

在 UITableViewController 的标题中,我有:

#import <UIKit/UIKit.h>
#import "ListViewController.h"
#import <iAd/iAd.h>

@interface ListViewController : UITableViewController <ADBannerViewDelegate>{
    bool bannerIsVisible;
}

@property (strong, nonatomic) IBOutlet ADBannerView *iAd;

@end

在 UITableViewController 的实现中,我有:

- (void)viewDidLoad
{
  [super viewDidLoad];

  iAd.delegate = self;
  // iAd.frame = CGRectMake(0.0,200.0,iAd.frame.size.width,iAd.frame.size.height); // does not work
  //  self.tableView.tableFooterView = iAd;   // Display the banner at the middle of the screen (depending upon the number item of the table)

  // Do not know how to have the default banner to appear at the very bottom of the screen (behind the tab bar) when the view is loaded ?

} 


- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
  NSLog(@"didFailToReceiveAdWithError");
  if (bannerIsVisible)
  {
    [UIView beginAnimations:@"animateAdBannerOff" context:NULL];
    banner.frame = CGRectMake(0.0,350.0,banner.frame.size.width,banner.frame.size.height);
    [UIView commitAnimations];
    bannerIsVisible = NO;
  }
}

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
  NSLog(@"bannerViewDidLoadAd");
  if (!bannerIsVisible)
  {
    [UIView beginAnimations:@"animateAdBannerOn" context:NULL];
    banner.frame = CGRectMake(0.0,317.0,banner.frame.size.width,banner.frame.size.height);
    [UIView commitAnimations];
    bannerIsVisible = YES;
  }
}

这个想法是让横幅出现在屏幕底部,并在标签栏上方显示它是横幅加载成功。

我遇到的问题:通过这种配置,我可以看到有时会调用“didFailToReceiveAdWithError”方法,有时会调用“bannerViewDidLoadAd”方法,但在每种情况下都不会显示横幅。

4

4 回答 4

10

我知道我回答得太晚了,但对于那些可能会访问这个帖子来回答的人来说。这可能会帮助他们

在头文件中

#import <UIKit/UIKit.h>
#import "ListViewController.h"
#import <iAd/iAd.h>

@interface ListViewController : UITableViewController <ADBannerViewDelegate>

@property (nonatomic, strong) ADBannerView *bannerForTableFooter;
@property (nonatomic) BOOL bannershouldBeVisible;

@end

在 .m 文件中

-(ADBannerView *)bannerForTableFooter
{
    if (!_bannerForTableFooter) {
        _bannerForTableFooter = [[ADBannerView alloc] initWithAdType:ADAdTypeBanner];
        _bannerForTableFooter.delegate = self;
    }
    return  _bannerForTableFooter;
}

在 ViewDidLoad

self.bannerForTableFooter.backgroundColor = [UIColor clearColor];

然后添加这些 tableView 数据源方法

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    if (self.bannershouldBeVisible) {
        return self.bannerForTableFooter.frame.size.height;
    }
    else
    {
        return 0;
    }
}

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    if (self.bannershouldBeVisible) {
        return self.bannerForTableFooter;
    }
    else
    {
        return [[UIView alloc] initWithFrame:CGRectZero];
    }
}

#pragma mark - iAd
-(void)bannerViewDidLoadAd:(ADBannerView *)bannerShown
{
    self.bannershouldBeVisible = YES;
    [self.tableView reloadData];
}

-(void)bannerView:(ADBannerView *)bannerShown didFailToReceiveAdWithError:(NSError *)error
{
    self.bannershouldBeVisible = NO;
    [self.tableView reloadData];
}
于 2014-02-09T18:25:08.673 回答
6

你的问题很常见。它不是由于情节提要而发生,而是由于您使用的是UITableViewController. UITableViewControllers免费给你很多,但他们确实需要一些东西。其中一个“事情”是他们要求他们的观点是UITableView.

你有几个选择。这里有几个首选的。

1) 将您的 iAd 添加为tableFooterView. 这需要一些额外的工作才能在滚动时将其保持在屏幕上,如我对这个问题的回答中所述

2)将您的UITableViewController子类转换为UIViewController子类。有趣的是,上面链接的问题的 OP 最终做了什么。本质上,您可以在为 iAd 制作动画时为(现在是子视图)tableView 的框架制作动画。然后它将按预期工作。我在此答案中概述了在文件中转换为UIViewController子类.xib的基本步骤,其中大部分应该适用于您。

于 2012-07-10T01:15:20.713 回答
5

有更好的方法。从这里: https ://github.com/romaonthego/RETableViewManager/issues/50

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect frame = self.iAd.frame;
    frame.origin.y = scrollView.contentOffset.y + scrollView.frame.size.height-_iAd.frame.size.height; // Move view to the bottom on scroll
    self.iAd.frame = frame;
    [scrollView bringSubviewToFront:self.iAd];
}

更新。有更好的方法iAd在底部显示横幅,因为iOS7.

- (void)viewDidLoad
{
[super viewDidLoad];
self.canDisplayBannerAds = YES;
...
}
于 2013-11-25T13:54:34.437 回答
4

从 iOS 7 开始,这些东西都不需要了。正如@Shmidt 在他的评论中所暗示的那样,您所要做的一切都self.canDisplayBannerAds = true在您的设置中viewDidLoad,其他一切都会自动处理。这也适用于 Table Views。

于 2015-01-28T17:04:27.813 回答