// 広告の全画面表示開始通知
#define IAD_LAYER_NOTIFY_SCREEN_SHOW_BEGIN @"iAdLayerNotifyScreenShowBegin"
// 広告表示位置
typedef enum {
iAdLayerPosition_Top_Center,
iAdLayerPosition_Botton_Center
} eiAdLayerPosition;
// 広告レイヤの基底クラス
@interface AdLayerBase : CCLayer
{
UIView* _adView;
BOOL _isAllowShow; // 広告の表示が許されているか
eiAdLayerPosition _framePosition; // 表示位置
}
@property (nonatomic, readwrite) eiAdLayerPosition FramePosition;
// 表示位置を指定して初期化する
+(id) nodeWithFramePosition:(eiAdLayerPosition)position;
// バナーを意図的に隠す
-(void) hideIAd;
// バナーを表示する
-(void) showIAd;
// 通知センタからの通知イベント
-(void) NotifyFromNotificationCenter:(NSNotification*)notification;
// 広告ビューの生成
-(void) createIAd;
// 広告ビューの解放
-(void) releaseIAd;
// 表示位置を得る
-(CGPoint) getShowPoint;
@end
【AdLayerBase.m】
@implementation AdLayerBase
@synthesize FramePosition = _framePosition;
// 表示位置を指定して初期化する
+(id) nodeWithFramePosition:(eiAdLayerPosition)position
{
return nil;
}
-(id) init
{
if (self = [super init]) {
// 通知センタのオブザーバ登録
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(NotifyFromNotificationCenter:)
name:nil object:nil];
_adView = nil;
_isAllowShow = YES;
_framePosition = iAdLayerPosition_Top_Center;
}
return self;
}
-(void) dealloc
{
// 通知センタのオブザーバ登録を削除する
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self releaseIAd];
[super dealloc];
}
// 画面遷移完了通知
-(void) onEnterTransitionDidFinish
{
[self createIAd];
}
// 通知センタからの通知イベント
-(void) NotifyFromNotificationCenter:(NSNotification*)notification
{
if (notification.name == ROOTVIEWCONTROLLER_NOTIFY_MSG_ROTATE) {
// 画面回転通知
// 広告の位置を調整する
CGRect rect = _adView.frame;
rect.origin = [self getShowPoint];
_adView.frame = rect;
// 表示許可があれば、広告を表示する
if (_isAllowShow) {
_adView.hidden = NO;
}
}
else if (notification.name == ROOTVIEWCONTROLLER_NOTIFY_MSG_WILL_ROTATE) {
// 回転前準備通知
// 広告を非表示にする
_adView.hidden = YES;
}
}
// バナーを意図的に隠す
-(void) hideIAd
{
_adView.hidden = YES;
_isAllowShow = NO;
}
// バナーを表示する
-(void) showIAd
{
_adView.hidden = NO;
_isAllowShow = YES;
}
// 表示位置を得る
-(CGPoint) getShowPoint
{
CGPoint position = CGPointZero;
CGSize winSize = [[CCDirector sharedDirector] winSize];
switch (_framePosition) {
case iAdLayerPosition_Top_Center:
position = CGPointMake((winSize.width - _adView.frame.size.width) / 2, 0);
break;
case iAdLayerPosition_Botton_Center:
position = CGPointMake((winSize.width - _adView.frame.size.width) / 2, winSize.height - _adView.frame.size.height);
break;
default:
break;
}
return position;
}
// 広告ビューの生成
-(void) createIAd
{
}
// 広告ビューの解放
-(void) releaseIAd
{
}
@end
通知センターから画面回転に関する通知を受け取り、画面の回転に合わせて広告が移動するようにしています。
画面回転の通知を発行する箇所については今回は省きます。
次にNend広告のレイヤを作ります。
【NADViewLayer.h】
@interface NADViewLayer : AdLayerBase <NADViewDelegate>
{
}
@end
【NADViewLayer.m】
@implementation NADViewLayer
// 表示位置を指定して初期化する
+(id) nodeWithFramePosition:(eiAdLayerPosition)position
{
NADViewLayer* layer = [NADViewLayer node];
if (layer != nil) {
layer.FramePosition = position;
}
return layer;
}
// 広告ビューの生成
-(void) createIAd
{
// 広告ビューが生成済みの場合、一度解放する
[self releaseIAd];
// 広告ビューを初期化
_adView = [[NADView alloc] initWithFrame:CGRectMake(0, 0, NAD_ADVIEW_SIZE_320x50.width, NAD_ADVIEW_SIZE_320x50.height)];
[(NADView*)_adView setNendID:NAD_KEY spotID:NAD_ID];
[(NADView*)_adView setBackgroundColor:[UIColor clearColor]];
[(NADView*)_adView setDelegate:self];
AppDelegate* delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
UINavigationController* rootViewController = delegate.navController;
[(NADView*)_adView setRootViewController:rootViewController];
// 広告位置の調整
CGPoint offset = [self getShowPoint];
_adView.frame = CGRectOffset(_adView.frame, offset.x, offset.y);
[rootViewController.view addSubview:_adView];
// 広告のロード
[(NADView*)_adView load:nil];
}
// 広告ビューの解放
-(void) releaseIAd
{
if (_adView != nil) {
[(NADView*)_adView setDelegate:nil];
[_adView removeFromSuperview];
[_adView release];
_adView = nil;
}
}
// 広告のロード成功時にコールされる
-(void) nadViewDidFinishLoad:(NADView*)adView
{
CCLOG(@"NAD Load Success");
}
@end
使い方は次の通りです。
CCLayer adLayer = [NADViewLayer nodeWithFramePosition:iAdLayerPosition_Top_Center];
[self addChild:adLayer];
その他原語環境によってiAdやGoogleAdMobに適宜切換える事も考えられますので、コールするだけで適した広告レイヤを返してくれるFactoryクラスを設計するのも良いかもしれません。
コメントする