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

时间:2015-01-27 14:42:01

标签: ios objective-c iphone uiviewcontroller uicontainerview

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

现在我要将横幅广告包含在该应用中。问题是因为我最初使用故事板和视图控制器实现了应用,我想知道在哪里添加广告横幅代码。

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

换句话说

现有

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

计划修改

- > UIViewController - >(has) - > Containerview - >(嵌入segue) - > UINavigationController - >(segue) - > LoginController - >(segue) - > MainpageController - >

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

由于

2 个答案:

答案 0 :(得分:2)

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

我在这里写了一篇关于它的博文:http://www.notthepainter.com/iad-admob-integration-with-a-dynamic-uiview/

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

以下是博客文章:

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

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

我找到了LARSAdController,这是larsacus在GitHub上的一个开源项目。除了一件事,他使广告整合变得非常容易。当您沿着他的快速发展路线前进时,您会看到覆盖您视图的广告,但不会缩小以适应广告。这是一个完全合理的设计决定,而不是我想要的。

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

您要做的第一件事就是从BannerView的.h文件中删除iAd,并在LARS TOLAdViewController类中删除广告。

#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的mod也非常简单。唯一奇怪的部分是删除对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上处于横向模式时,广告的大小和报告的大小不同,在底部留下一个黑条屏幕。我已经对它进行了larsacus,当我知道更多时,我会更新这篇文章。

答案 1 :(得分:0)

**请尝试以下操作:**

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
        }
相关问题