使用标准的UINavigationController根应用程序,是否可以在视图层次结构下方的屏幕底部显示单个ADBannerView?也就是说,如果不修改可以推送到根UINavigationController的每个视图控制器/视图,我可以看到全局ADBannerView吗?
我不知道如何在IB或代码中设置它。帮助
我用模糊的答案看到了类似的问题。我正在寻找一个具体的例子。
答案 0 :(得分:10)
编辑:在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,并且需要一些东西来完成这个设置,但也不是太糟糕。
我希望这有助于某人!
答案 1 :(得分:3)
在Apple的开发示例代码中,iAdSuite项目内容项目已经为您完成了这项工作。强烈推荐。
答案 2 :(得分:2)
在我的根视图控制器(带有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];
}
答案 3 :(得分:0)
我采用了此处给出的iAdSuite中建议的方法
http://developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/Intro.html
我下载了代码并专注于“标签”示例。我将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方法中设置视图标题(不知何故,在条形项上设置它似乎没有工作没有设置图像;后面可能反映我的图像的问题)。 / p>
我原来的配置是
TabViewController
NavController1 NavController2 NavController3 ...
| | |
CustomViewController1 CustomViewController2 CustomViewController3
我的最终配置现在是
TabViewController
NavController1 NavController2 NavController3 ...
| | |
iAdView1 iAdView2 iAdView3
| | |
CustomViewController1 CustomViewController2 CustomViewController3
就视图生命周期而言,我应该补充一点,调用updateiAd方法时只存在NavControllers。
调用完成后会创建单独的CustomViewControllers1 / 2/3 / etc。