是否可以使用基于 UINavigationController 的标准应用程序在屏幕底部、视图层次结构下方显示单个 ADBannerView?也就是说,在不修改可以推送到根 UINavigationController 的每个视图控制器/视图的情况下,我可以让全局 ADBannerView 可见吗?
我不确定如何在 IB 或代码中进行设置。帮助?
我看到类似的问题,答案很模糊。我正在寻找一个具体的例子。
是否可以使用基于 UINavigationController 的标准应用程序在屏幕底部、视图层次结构下方显示单个 ADBannerView?也就是说,在不修改可以推送到根 UINavigationController 的每个视图控制器/视图的情况下,我可以让全局 ADBannerView 可见吗?
我不确定如何在 IB 或代码中进行设置。帮助?
我看到类似的问题,答案很模糊。我正在寻找一个具体的例子。
编辑:在 iOS5+ 中执行此操作的更好方法可能是使用视图控制器包含。也就是说,制作一个包含您的广告和应用程序控制器(导航、选项卡等)的根控制器。
我想出了一个办法来做到这一点。这是我所做的:
在我的第一次尝试中,我创建了一个名为 AdBannerController 的新视图控制器。对于它的视图,我创建了一个全屏视图和两个子视图。第一个子视图(contentView)用于常规内容,第二个是 AdBannerView。我使用这个视图控制器的一个实例作为与应用程序窗口关联的视图控制器( [window addSubview: adBannerController.view] )。然后我将我的 UINavigationController.view 添加为 adBannerController.view 的子视图:[adBannerController.contentView addSubview: navigationController.view]。
除了推送到 UINavigationController 的视图控制器从未调用过他们的 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,使用该设置需要做一些事情,但还不错。
我希望这可以帮助别人!
在 Apple 的开发示例代码中,iAdSuite 项目包含为您完成此操作的项目。强烈推荐。
在我的根视图控制器(带 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];
}
我调整了此处给出的 iAdSuite 中建议的方法
http://developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/Intro.html
我下载了代码并专注于“标签”示例。我将 BannerViewController.h/.m 原样复制到我的项目中。
我使用故事板方法以通常的方式创建了所有视图。但是,在我的 AppDelegate 类中,我随后访问了已经构建的选项卡栏 - 包含所有情节提要构建的 viewController。
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。