代码之家  ›  专栏  ›  技术社区  ›  TomSwift

iPhone应用程序中的全局ADBannerView

  •  11
  • TomSwift  · 技术社区  · 14 年前

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

    我不知道如何设置它,无论是在IB还是在代码中。救命啊?

    4 回复  |  直到 14 年前
        1
  •  10
  •   TomSwift    11 年前

    编辑:在iOS5+中更好的方法可能是使用view-controller-containment。也就是说,创建一个包含广告和应用程序控制器(nav、tab等)的根控制器。

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

    除了推送到UINavigationController的viewcontrollers从未调用will/did load/unload方法之外,这种方法基本上是有效的。嘘。我在一些地方读到,这是UINavigationController视图不是app窗口的直接后代的症状。

    对于我的第二次尝试,我使用相同的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构造它的常规“content”视图,但是我交换了它并用我自己的视图替换它,它是content和ad视图的容器。

    这很管用。我也在使用three20,有一些东西需要使这个设置工作,但不是太糟。

    我希望这能帮助别人!

        2
  •  3
  •   fearmint    14 年前

    在Apple的dev示例代码中,iAdSuite项目包含为您完成这项工作的项目。强烈推荐。

        3
  •  2
  •   mutable2112    13 年前

    在我的根视图控制器(w/ADBannerViewDelegate)中,我通过将横幅添加到nav controller视图来设置横幅,该视图使其始终位于顶部:

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

    注意,您必须注释掉代理方法bannerViewIDLoadAD中的layoutImated,因为它将尝试向上移动ad视图:

    - (void)bannerViewDidLoadAd:(ADBannerView *)banner
    {
        //[self layoutAnimated:YES];
    }
    
        4
  •  0
  •   chris fabri    11 年前

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

    我下载了代码,重点放在“tab”示例上。我将BannerViewController.h/.m原样复制到我的项目中。

    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
    

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

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