iAd在UINavigationController中的UITableViewController下面

时间:2012-03-25 03:07:39

标签: ios5 uinavigationcontroller uitableview iad

我正在为博客网站构建应用程序。

我有一个带UITableViewController的UINavigationController,因为它的根视图。

我把它放在一个故事板中没问题,但是我试图将iAd视图拖到屏幕的底部,xcode不会让我添加它。

看起来我必须从UITableViewController的子类切换到UIViewController的子类,并将我的委托和数据源方法放在我的子类UIViewController中。

这对我来说似乎不对。我只想尝试UITableView的文章标题,顶部是导航栏,底部是iAd ...

么?建议?

提前致谢。

3 个答案:

答案 0 :(得分:23)

实现此目的的最简单方法之一是使用UITableView的{​​{1}}属性。是的,我知道页脚停留在桌子的底部,但它没有必要。您可以在表格中设置其框架。像这样添加iAd作为页脚:

tableFooterView

然后,要在表格滚动时调整iAd的框架,请实施self.tableView.tableFooterView = iAd; 委托方法:(这是可能的,因为UIScrollViewUITableView的子类)

UIScrollView

您可以看到实施很简单。我们只需使用-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ CGRect iAdFrame = iAd.frame; CGFloat newOriginY = table.contentOffset.y + table.frame.size.height - iAdFrame.size.height; CGRect newIAdFrame = CGRectMake(iAdFrame.origin.x, newOriginY, iAdFrame.size.width, iAdFrame.size.height); iAd.frame = newIAdFrame; } contentOffset来确定iAd框架下方的距离。

答案 1 :(得分:2)

我尝试使用NJones上面的示例来调整tableFooterView的位置,但我发现在重新加载数据或刷新表时很难管理它。

然后我发现可以通过将iAd横幅添加到tableViewController视图的 superview 来完成。

self.bannerViewController = [[BannerViewController alloc] init];
[self.bannerViewController.view setHidden:YES];
[self.bannerViewController.view setFrame:CGRectMake(0, self.view.superview.frame.size.height - self.tabBarController.tabBar.frame.size.height - 50, 320, 50)];

[self.view.superview addSubview:self.bannerViewController.view];
[self.bannerViewController loadBanner];

当加载横幅时,我创建了一个tableFooterView,为tableViewController中的最后一个单元格腾出空间

-(void)bannerDidLoad{
     [self.bannerViewController.view setHidden:NO];
     self.tableView.tableFooterView = [[UIView alloc];
     initWithFrame:self.bannerViewController.view.frame];
 }

答案 2 :(得分:0)

我不得不对NJones发布的解决方案进行一些更改,因为广告没有显示在所有其他单元格/视图之上。

首先确保你的tableViewController是AdBannerViewDelegate:

@interface MyTableViewController () <ADBannerViewDelegate>

将AdBanner添加到tableviewcontroller:

- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    ADBannerView *adBanner = [[ADBannerView alloc]initWithAdType:ADAdTypeBanner];
    adBanner.delegate = self;
    self.tableView.tableFooterView = adBanner;
}

定位广告横幅的代码来自NJones,我只添加了最后一行以将广告横幅带到前面:

-(void)positionAdBanner {
    ADBannerView *adBanner = (ADBannerView *) self.tableView.tableFooterView;
    if (adBanner) {
        CGRect iAdFrame = adBanner.frame;
        CGFloat newOriginY = self.tableView.contentOffset.y + self.tableView.frame.size.height - iAdFrame.size.height;
        CGRect newIAdFrame = CGRectMake(iAdFrame.origin.x, newOriginY, iAdFrame.size.width, iAdFrame.size.height);
        adBanner.frame = newIAdFrame;
        [self.tableView bringSubviewToFront:adBanner];
    }
}

只要视图要布局其子视图,就会调用此函数(因此您只需要在此处,无需检查滚动等):

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    [self positionAdBanner];
}

您还应该处理ADBannerViewDelegate方法:

-(void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    banner.hidden = NO;
    [self positionAdBanner];
}
-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    banner.hidden = YES;
}