问题 iPhone应用程序中的全局ADBannerView


是否可以使用标准的UINavigationController根应用程​​序,在视图层次结构下方的屏幕底部显示单个ADBannerView?也就是说,如果不修改可以推送到根UINavigationController的每个视图控制器/视图,我可以看到全局ADBannerView吗?

我不知道如何在IB或代码中设置它。帮帮我?

我用模糊的答案看到了类似的问题。我正在寻找一个具体的例子。


12450
2017-09-08 15:22


起源



答案:


编辑:在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,并且需要一些东西才能使这个设置工作,但也不是太糟糕。

我希望这可以帮助别人!


10
2017-09-08 20:56



非常有帮助,我现在正在尝试这个。 - bentford
我实现了类似的东西,但在我使用UISearchBar作为tableViewHeader的视图中遇到困难,以及在navBar透明的视图中 - coneybeare
这实际上似乎有效 - Paul de Lange
@Paul de Lange - 在iOS5中不再需要这个hack。只需使自己成为根级别的容器视图控制器。 - TomSwift
@TomSwift - 感谢您的信息。不针对iOS 4的生产代码对我们来说还有很长的路要走:( - Paul de Lange


答案:


编辑:在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,并且需要一些东西才能使这个设置工作,但也不是太糟糕。

我希望这可以帮助别人!


10
2017-09-08 20:56



非常有帮助,我现在正在尝试这个。 - bentford
我实现了类似的东西,但在我使用UISearchBar作为tableViewHeader的视图中遇到困难,以及在navBar透明的视图中 - coneybeare
这实际上似乎有效 - Paul de Lange
@Paul de Lange - 在iOS5中不再需要这个hack。只需使自己成为根级别的容器视图控制器。 - TomSwift
@TomSwift - 感谢您的信息。不针对iOS 4的生产代码对我们来说还有很长的路要走:( - Paul de Lange


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


3
2018-01-24 16:32



是的,但它没有做OP要求的事情 - 相反,Apple的示例中的广告随子视图滑入,并在您使用“后退”按钮时再次退出。 - Joe Strout
当然,如果管理广告的视图控制器被推入堆栈并随后被删除。我会将应用委托和窗口使用的视图控制器替换为广告管理器,然后在其下添加视图层次结构。 - JoePasq


在我的根视图控制器(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];

请注意,您必须在委托方法bannerViewDidLoadAd中注释掉layoutAnimated,因为它会尝试向上移动广告视图:

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

2
2017-12-26 23:32





我改编了这里给出的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,将其委托设置为self(例如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];
}

这种方法根据需要在每个视图的底部放置相同的“广告”。我还必须在每个自定义viewController的viewDidLoad方法中设置视图标题(不知何故,在条形项上设置它似乎没有工作没有设置图像;后者可能反映了我的图像的问题)。

我的原始配置是

                           TabViewController

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

我的最终配置现在

                           TabViewController

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

在视图生命周期方面,我应该补充一点,在调用updateiAd方法时只存在NavControllers。

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


0
2018-06-22 11:43