使用故事板在 UItableView 中添加 iAd 横幅

Posted

技术标签:

【中文标题】使用故事板在 UItableView 中添加 iAd 横幅【英文标题】:Add iAd banner in UItableView with storyboard 【发布时间】:2012-07-09 18:24:12 【问题描述】:

我没有设法让 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”方法,但在每种情况下都不会显示横幅。

【问题讨论】:

您有问题吗?目前尚不清楚您需要什么帮助。 嗯...对不起,我会更清楚的 【参考方案1】:

我知道我为时已晚,但对于可能访问此线程以寻求答案的人来说。这可能会帮助他们

在头文件中

#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];

【讨论】:

你拯救了我的一天,谢谢! 这是正确答案。实施3分钟! +1 @Taseen【参考方案2】:

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

您有几个选择。以下是一些首选的。

1) 将您的 iAd 添加为 tableFooterView。这需要一些额外的工作才能在滚动时将其保持在屏幕上,如my answer to this question 中所述。

2) 将您的 UITableViewController 子类转换为 UIViewController 子类。有趣的是,上面链接的问题的 OP 最终做了什么。本质上,您可以在为 iAd 制作动画时为(现在是子视图)tableView 的框架制作动画。然后它将按预期工作。我outlined the basic steps for converting to a UIViewController subclass in a .xib file in this answer,大部分应该都适用于你。

【讨论】:

我测试了表格页脚方法,但是当视图出现时,横幅位于屏幕中间附近。我需要滚动表格视图以将其移动到屏幕底部。【参考方案3】:

有更好的方法。 从这里: 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];

更新。自ios7 以来,有更好的方法在底部显示iAd 横幅。

- (void)viewDidLoad

[super viewDidLoad];
self.canDisplayBannerAds = YES;
...

【讨论】:

我一直在使用这种方法,但最近在 iOS 8.1 中我正在分析我的应用程序,这行“self.iAd.frame = frame”对性能有很大影响!滚动时屏幕滞后。我不确定我是否在 iOS 7 中看到了这一点。 谢谢施密特。当您有一个 UITableView 并希望将其保留在页面底部时,这是否有效? 是的。而这条线意味着你不需要ADBannerView。它会自己安装。 别忘了在 .h 文件中使用#import 【参考方案4】:

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

【讨论】:

你好。欢迎来到这里,但这不是一个好的答案......您可以对您所说的评论进行投票,甚至在您的回答中引用它,但截至目前,您似乎在回答中引用了评论,这不是答案的重点...... 嗨菲利克斯,明白。施密特的回答并不清楚,它没有明确说明 scrollview 方法现在是多余的。这就是为什么我认为将其作为一个独立的答案也是值得的。此外,我还没有足够的积分来支持,所以即使很清楚,我也无法支持评论。如果没有其他人,这对我来说将是一个有用的答案/提醒。 :-) 感谢您的欢迎! 我的荣幸。看看 skrrgwasme 的编辑(多么好的名字!)如何让你的答案变得更好:消除噪音 (For newbies like me) 和格式化代码可能看起来微不足道,但现在这个答案本身就有价值,即使很短。

以上是关于使用故事板在 UItableView 中添加 iAd 横幅的主要内容,如果未能解决你的问题,请参考以下文章

如何使用故事板在 AppDelegate 中使用自定义 Navigationcontroller

故事板在 iOS 5 中是如何工作的?

故事板在反向预览中显示视图控制器(Xcode 8.3.2)

iOS 14 启动屏幕故事板在 iOS 14 设备上不显示图像

跨各种 UITableViews 的 UITableViewCell 原型单元格

如何使用 imdbpy 检索故事情节段落?