全球在iPhone应用程序中的ADBannerView

问题描述:

是否有可能使用标准的基于UINavigationController的应用程序,在屏幕底部的视图层次结构下方显示单个ADBannerView?也就是说,在不修改每个可以推送到根UINavigationController的view-controller/view的情况下,我可以看到全局的ADBannerView吗?全球在iPhone应用程序中的ADBannerView

我不知道如何设置,无论是在IB或代码。帮帮我?

我看到类似的问题,含糊不清的答案。我正在寻找一个具体的例子。

编辑:在iOS5 +中执行此操作的更好方法很可能会使用视图控制器遏制。也就是说,建立一个包含您的广告和应用程序控制器(导航,选项卡等)的根控制器。

我想出了一个方法来做到这一点。这是我做的:

对于我的第一次尝试,我创建了一个名为AdBannerController的新视图控制器。为了它的观点,我创建了一个全屏视图和两个子视图。第一个子视图(contentView)用于常规内容,第二个是AdBannerView。我使用这个视图控制器的一个实例作为与应用程序窗口关联的视图控制器([window addSubview:adBannerController.view])。然后,我将我的UINavigationController.view添加为adBannerController.view的子视图:[adBannerController.contentView addSubview:navigationController.view]。

除了被推送到UINavigationController的viewcontrollers从来没有得到他们的will/did-load/unload方法以外,这个主要工作。哪里哪里。我在几个地方读到,这是UINavigationController视图的一个症状,不是应用程序窗口的直接后裔。

对于第二次尝试,我使用了相同的AdBannerController,并从UINavigationController派生它。这一次,我确实在的loadView如下:

- (void)loadView 
{ 
    [super loadView]; 

    _contentView = [self.view retain]; 

    self.view = [[[UIView alloc] initWithFrame: _contentView.frame] autorelease]; 

    [self.view addSubview: _contentView]; 

    _adView = [[ADBannerView alloc] initWithFrame: CGRectMake(0, _contentView.bounds.size.height, 320, 50)]; 
    _adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50; 
    _adView.delegate = self; 

    [self.view addSubview: _adView]; 

    /* for visual debugging of view layout 
    [[_mainView layer] setCornerRadius: 6.0]; 
    [[_mainView layer] setMasksToBounds: YES]; 
    [[_mainView layer] setBorderWidth: 1.5]; 
    [[_mainView layer] setBorderColor: [[UIColor grayColor] CGColor]]; 
    */ 
} 

通知会发生什么 - 我让超UINavigationController的构建其常规的“内容”的观点,但我换出来,用我自己的观点是一种容器更换广告内容和广告的视图。

这工作得很好。我也使用three20,并且有一些东西需要使用该设置进行工作,但不是太糟糕。

我希望这可以帮助别人!

+0

非常有帮助,我现在正在尝试。 – bentford 2010-09-17 10:24:58

+1

我实现了这样的事情,但在视图中遇到了困难,我使用UISearchBar作为tableViewHeader,以及navBar透明的视图 – coneybeare 2010-09-25 19:58:33

+0

这实际上似乎工作 – 2012-06-14 16:16:38

在Apple的开发示例代码中,iAdSuite项目的内容项目已为您完成。强烈推荐。

+1

是的,但它没有做OP的要求 - 相反,苹果样本中的广告滑入子视图,当你使用“返回”按钮时,会再次退出 – 2011-06-08 16:22:27

+0

当然,如果管理广告的视图控制器被压入堆栈并随后被移除,我将替换应用代理和窗口在广告中使用的视图控制器管理r,然后在其下添加视图层次结构。 – JoePasq 2011-06-08 18:13:22

在我的根视图控制器(W/ADBannerViewDelegate)设置我的旗帜将其添加到导航控制器视图,它保持它的顶部在任何时候都:

banner = [[ADBannerView alloc] init]; 
banner.delegate = self; 
banner.frame = CGRectMake(0.0, 430.0, banner.frame.size.width, banner.frame.size.height); 
[self.navigationController.view addSubview:banner]; 

注意你将不得不注释掉layoutAnimated在委托方法bannerViewDidLoadAd,因为它会尝试移动广告浏览了:

- (void)bannerViewDidLoadAd:(ADBannerView *)banner 
{ 
    //[self layoutAnimated:YES]; 
} 

我适应的办法在iAdSuite建议这里给出

http://developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/Intro.html

我下载了代码并专注于'tab'示例。我将BannerViewController.h/.m复制到我的项目中。

我用故事板方式以通常的方式创建了我的所有视图。然而,在我的AppDelegate类中,我接着访问了已经建好的标签栏 - 包含所有storyboard构建的viewControllers。

的AppDelegate类实现TabBarControllerDelegate协议:

@interfaceAppDelegate : UIResponder <UITabBarControllerDelegate, UIApplicationDelegate> 

的AppDelegate中实现didFinishLaunchingWithOptions方法抓住预构建的TabBar,其代表设置到自(例如,AppDelegate类)。

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: 
// ---------------------------------------------------------- 
// Set the TabBarController delegate to be 'self' 
// ---------------------------------------------------------- 
_tabBarController = (UITabBarController*)self.window.rootViewController; 

// tabController.selectedIndex = [defaults integerForKey:kOptionLastTabSelectedKey]; 
_tabBarController.delegate = self; 

// update tab bar per iAdSuite approach 
[self updateiAd]; 

我再建一个新的设置每个iAdSuite办法控制器和重置这些新标签栏项目的标签栏。

-(void)updateiAd { 
NSArray* viewControllers = [_tabBarController viewControllers]; 
NSMutableArray*newViewControllers = [[NSMutableArray alloc] init]; 
BannerViewController*bvc=NULL; 
for(UIViewController * vc in viewControllers) { 
    bvc = [[BannerViewController alloc] initWithContentViewController:vc]; 
    [newViewControllers addObject:bvc]; 
} 

// set the new view controllers, replacing the original set 
[_tabBarController setViewControllers:newViewControllers]; 
} 

这种方法将相同的“广告”在每个视图的底部,正如需要的。我还必须在每个自定义视图控制器的viewDidLoad方法中设置视图标题(不知何故,将它设置在酒吧项目似乎没有工作没有设置图像;后来可能反映了我的图像问题)。

我原来的配置是

      TabViewController 

NavController1    NavController2   NavController3 ... 
     |       |      | 
CustomViewController1  CustomViewController2  CustomViewController3 

我的最终配置现在

      TabViewController 

NavController1    NavController2   NavController3 ... 
    |       |      | 
iAdView1       iAdView2    iAdView3 
    |       |      | 
CustomViewController1  CustomViewController2  CustomViewController3 

是鉴于生命周期方面,我要补充一点,只有NavControllers是存在当时updateiAd方法调用。

在调用完成后,将创建单独的CustomViewControllers1/2/3/etc。