標準の UINavigationController をルートとするアプリで、画面の下部、ビュー階層の下に単一の ADBannerView を表示することは可能ですか? つまり、ルート UINavigationController にプッシュできる各ビュー コントローラー/ビューを変更せずに、グローバルな ADBannerView を表示できますか?
IBまたはコードでこれを設定する方法がわかりません。ヘルプ?
あいまいな答えを持つ同様の質問があります。具体例を探しています。
標準の UINavigationController をルートとするアプリで、画面の下部、ビュー階層の下に単一の ADBannerView を表示することは可能ですか? つまり、ルート UINavigationController にプッシュできる各ビュー コントローラー/ビューを変更せずに、グローバルな ADBannerView を表示できますか?
IBまたはコードでこれを設定する方法がわかりません。ヘルプ?
あいまいな答えを持つ同様の質問があります。具体例を探しています。
編集:iOS5 +でこれを行うためのより良い方法は、ViewControllerの封じ込めを使用する可能性があります。つまり、広告とアプリケーションコントローラー(ナビゲーション、タブなど)を含むルートコントローラーを作成します。
私はこれを行う方法を考え出しました。これが私がしたことです:
最初の試みとして、AdBannerControllerという新しいビューコントローラーを作成しました。そのビューのために、フルスクリーンビューと2つのサブビューを作成しました。最初のサブビュー(contentView)は通常のコンテンツ用で、2番目はAdBannerViewです。このビューコントローラーのインスタンスを、アプリウィンドウに関連付けられたビューコントローラーとして使用しました([window addSubview:adBannerController.view])。次に、UINavigationController.viewをadBannerController.viewのサブビューとして追加しました:[adBannerController.contentView addSubview:navigationController.view]。
これは、UINavigationControllerにプッシュされたviewcontrollerがwill / did-load/unloadメソッドを呼び出さなかったことを除いてほとんど機能しました。シャック。これは、UINavigationControllerビューがアプリウィンドウの直接の子孫ではないことの症状であると、いくつかの場所で読みました。
2回目の試行では、同じ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 の dev サンプル コードでは、iAdSuite プロジェクト コンテンツ プロジェクトがこれを行っています。強くお勧めします。
ルート ビュー コントローラー (ADBannerViewDelegate を使用) で、バナーを nav コントローラー ビューに追加してセットアップし、常に一番上に表示します。
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 クラスでは、ストーリーボードで構築されたすべてのビューコントローラーを含む、構築済みのタブバーにアクセスしました。
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];
}
このアプローチでは、必要に応じて、各ビューの下部に同じ「広告」を配置します。また、各カスタム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 が作成されます。