【问题标题】:iAd below UITableViewController inside UINavigationControllerUINavigationController 内的 UITableViewController 下面的 iAd
【发布时间】:2012-04-09 02:24:55
【问题描述】:

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

我有一个 UINavigationController 和一个 UITableViewController 作为它的根视图。

我把它放在情节提要中没问题,但我试图将 iAd 视图拖到屏幕底部,xcode 不允许我添加它。

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

这对我来说似乎是错误的。我只是想以文章标题的 UITableView 结束,顶部有一个导航栏,底部有一个 iAd...

建议?有什么建议吗?

提前致谢。

【问题讨论】:

    标签: ios5 uinavigationcontroller uitableview iad


    【解决方案1】:

    实现此目的的最简单方法之一是使用UITableViewtableFooterView 属性。是的,我知道页脚位于表格的底部,但并非必须如此。您可以在表格中设置其框架。像这样添加 iAd 作为页脚:

    self.tableView.tableFooterView = iAd; 
    

    然后,要在表格滚动时调整 iAd 的框架,请实现 UIScrollView 委托方法:(这是可能的,因为 UITableViewUIScrollView 的子类)

    -(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;
    }
    

    您可以看到实现非常简单。我们只需使用contentOffsety 来确定 iAd 的框架应该向下多远。

    【讨论】:

    • 这很有效,谢谢。然而,为了记录,我最终只是使用了一个 viewController 和一个 tableView 而不是使用 tableViewController,所以我调整 tableView 的大小并将 iAd 放在下面没有问题。
    • 我不知道如何让这段代码在我的应用程序中工作。我已经在我的表格视图的表格视图页脚中拖动横幅视图,但我不确定从那里去哪里.. 这个变量 iAd 是在哪里分配的?
    • 我明白了,我刚刚以编程方式初始化了一个新的AdBannerView
    • 谢谢 NJones!这对我有用!我也在 viewDidAppear 方法中尝试过这个,所以你不必滚动就可以显示广告,它也可以在那里工作
    • 我意识到这个线程有点老了,但只是想更新......我不能完全让它在 iOS6 上工作。如果我只是在表格页脚中使用它,那么页脚的高度将会关闭,尽管有时对齐似乎是有效的。一旦我通过 table:heightForFooter 委托设置了高度,这似乎根本不起作用。
    【解决方案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];
     }
    

    【讨论】:

      【解决方案3】:

      我不得不对 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多