在多个 UIViewcontroller 应用程序中添加广告横幅

Adding Ad Banners in multiple UIViewcontroller app

我像 2 年前一样使用故事板构建了一个应用程序。应用程序的根视图控制器是 UINavigation 控制器,根视图控制器根据用户交互加载视图控制器。从根视图控制器,根据用户操作,可以在 UINavigation 中显示 8 个其他视图控制器。

现在我想将横幅广告添加到那个 app.The 问题是因为我最初是使用故事板和视图控制器实现应用程序的,所以我想知道在哪里添加横幅广告的代码。

我做了一些研究,看起来可能的选择是 1. 添加一个 UIViewcontroller 作为根视图控制器 2.在UIViewcontroller中添加一个ContainerView 3.从容器视图中将Exiting navigation controller设为嵌入式segue 4.添加广告横幅(想要屏幕底部的广告横幅)。

换句话说

现有

--> UINavigationController-->(segue)-->LoginController-->(segue)-->MainpageController-->

计划修改

--> UIViewController-->(has)-->Containerview-->(embed segue)-->UINavigationController-->(segue)-->LoginController-->(segue)-->MainpageController -->

我想知道的是,在我的案例中,这是实施广告横幅的最佳方法吗?或者我可以在导航控制器中显示每个视图控制器的广告横幅视图吗?

谢谢

Apple 的 BannerView 示例应用程序似乎涵盖了这一点。它不是故事板应用程序,但应适用基本规则。有一个 VC 具有广告视图以及您的应用程序视图。

我在这里写了一篇博客post:http://www.notthepainter.com/iad-admob-integration-with-a-dynamic-uiview/

请注意,博客 post 是关于 iAd 和 ad mob 集成的,但应适用相同的概念。您根本不需要使用广告集成来完成此操作。你真的可以忽略这个答案的其余部分,看看 Apple 如何使用 BannerView 示例应用程序。

这是博客 posting:

已经发布了 2 个应用程序,都使用了 iAds。我使用 Apple 的 BannerView 示例代码来实现它。基本上,在您的委托中,您不会将 root 设置为您期望的根 UIViewController,而是将 root 设置为包含您的真实根的 BannerView。当 iAd 可用时,您的主视图会缩小并且 iAd 显示在底部。当广告不可用时,您的视图会扩展到其“正常”大小。

这在测试中非常有效,所以我将这两个应用程序都发布到了应用程序商店。然而,当我第一次从商店下载这些版本时,我很惊讶地发现没有广告。事实证明,至少现在,iAd 的填充率非常糟糕。所以我想在 iAd 不可用时展示另一个广告。

我在 GitHub 上找到了 larsacus 的开源项目 LARSAdController。除了一件事,他使广告整合变得非常容易。当你沿着他的快速发展路线走下去时,你会看到覆盖你视野的广告,它不会缩小以容纳广告。这是一个完全合理的设计决定,只是不是我想要的。

所以我决定修改Apple的BannerView来使用LARSAdController。很简单。

您要做的第一件事是从 BannerView 的 .h 文件中删除 iAd 并在 LARS TOLAdViewController class.

中删除广告
#import "TOLAdViewController.h"

#define KVO_AD_VISIBLE @"KVO_AD_VISIBLE"

@interface BannerViewController : TOLAdViewController

(暂时忽略 KVO_AD_VISIBLE 定义,我稍后会介绍。)在 .m 文件中也删除 iAd 并进行以下更改:

@implementation BannerViewController {
    UIView *_bannerView;
    UIViewController *_contentController;
    BOOL isLoaded;
}

我们将 _bannerView 从 ADBannerView 更改为普通的旧 UIVIew。 ADBannerView 也有一个 bannerLoaded 属性,我们必须用我们的 isLoaded 布尔值替换它。 initWithContentViewController也很容易修改。

// IAPHelper *sharedInstance = [//IAPHelper sharedInstance];
//if ([sharedInstance showBannerAds]) {
if (YES) {
    _bannerView = [[UIView alloc] initWithFrame:CGRectZero];
} else {
    _bannerView = nil;      // not showing ads since the user has upgraded
}

注意注释掉的部分。如果您使用应用内购买将广告支持版本转换为无广告版本,您可以在此处执行此操作。

在方法的最后,我们将使用键值观察 (KVO) 来观察 LARS 并查看广告何时投放或删除。 (我可能会在以后的博文中介绍 KVO。)

[[LARSAdController sharedManager] addObserver:self
                               forKeyPath:kLARSAdObserverKeyPathIsAdVisible
                                  options:0
                                  context:KVO_AD_VISIBLE]

以及观察代码:

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context;
{
    if(context == KVO_AD_VISIBLE) {
        NSNumber *isVisible = [object valueForKey:kLARSAdObserverKeyPathIsAdVisible];

        if ([isVisible boolValue]) {
            _bannerView.frame = [[LARSAdController sharedManager] containerView].frame;
            isLoaded = YES;
        } else {
            isLoaded = NO;
        }
    }

    [self.view setNeedsLayout];
    [self.view layoutIfNeeded];
}

我们保存新广告的框架并更新 isLoaded 变量。 (最初认为我需要调用 setNeedsLayout 和 layoutIfNeeded 但实际上我没有。)viewDidLayoutSubviews 的 mods 也非常简单。唯一奇怪的部分是删除了对 ADBannerContentSizeIdentifierPortrait 和 ADBannerContentSizeIdentifierLandscape 的引用,并将其全部替换为一行:

bannerFrame.size = [_bannerView sizeThatFits:contentFrame.size];

几行之后您使用新的 isLoaded 变量

if (isLoaded) {

不要忘记在 dealloc 中清理你的观察者:

-(void) dealloc;
{
    [[LARSAdController sharedManager]  removeObserver:self forKeyPath:kLARSAdObserverKeyPathIsAdVisible];
}

剩下的就是在您的应用委托中告诉 LARS 您的广告:

[[LARSAdController sharedManager] registerAdClass:[TOLAdAdapterGoogleAds class] withPublisherId:@"a14e55c99c24b43"];
[[LARSAdController sharedManager] registerAdClass:[TOLAdAdapteriAds class]];

LARSBannerViewController *root = [[LARSBannerViewController alloc] initWithNibName:@"LARSBannerViewController" bundle:nil];

_bannerViewController = [[BannerViewController alloc] initWithContentViewController:root];

[self.window setRootViewController:_bannerViewController];

就是这样。现在您的应用应该会显示 iAD 或 AdMob 广告,并且您的视图会缩小以适应它们。

当然有一个错误,我不知道这是在 AdMob 服务器中还是在 LARS 中,但是当您在 iPhone 上处于横向模式时,广告的大小和报告的大小不同留下屏幕底部的黑条。我已经 ping larsacus 关于它,并会在我知道更多时更新此 post。

**试试这个:**

let arrViews = NSMutableArray()
        arrViews.add(self.viewEmail)
        arrViews.add(self.viewEventTime)
        arrViews.add(self.viewLocation)
        for vc in arrViews
        {
            let vc1 = vc as! UIView
            vc1.layer.masksToBounds = false
            vc1.layer.shadowOffset = CGSize(width: 2.5, height: 2.5)
            vc1.layer.shadowRadius = 5
            vc1.layer.shadowOpacity = 0.5
        }