iAd広告を画面上部に表示する


UIViewController に Container View と Ad BannerView を配置して、
広告が配信されているときだけ Ad BannerView を表示するようにします。

iOS7では上部に表示されているステータスバーの関係で、
Navigation Controller がステータスバーとかぶっている場合は、
Navigation Controller の高さがステータスバー分だけ大きくなるようになっているようです。

また、広告が表示されるときに、Navigation Controller を下に移動させた場合は、
Navigation Controller がステータスバーとかぶらなくなるので高さが小さくなるのですが、
再描画が入らないと高さが高いままになって見た目がおかしくなってしまいました。

従いまして、最初から Navigation Controller がステータスバーとかぶらない場所に配置することにより回避しました。
もっといい方法がありそうですが、とりあえずこれでそんなにおかしくなく動いています。

```objectivec:iAd広告を画面上部に表示する
- (void) viewDidAppear:(BOOL)animated
{
	[super viewDidAppear:animated];
	
	// iAdを画面の上にする.
	int statusBarOffset = self.topLayoutGuide.length;
	CGRect bannerFrame = self.bannerView.frame;
	bannerFrame.origin.y = -bannerFrame.size.height;
	self.bannerView.frame = bannerFrame;
	CGRect containerFrame = self.containerView.frame;
//	containerFrame.origin.y = 0;
	containerFrame.origin.y = statusBarOffset;
	containerFrame.size.height = self.view.frame.size.height - statusBarOffset;
	self.containerView.frame = containerFrame;
	
	// iAdを画面の下にする.
//	CGRect bannerFrame = self.bannerView.frame;
//	bannerFrame.origin.y = self.view.frame.size.height;
//	self.bannerView.frame = bannerFrame;
//	CGRect containerFrame = self.containerView.frame;
//	containerFrame.size.height = self.view.frame.size.height;
//	self.containerView.frame = containerFrame;
}

- (void) showBannerView:(ADBannerView *)banner
{
	// iAdを画面の上にする.
	int statusBarOffset = self.topLayoutGuide.length;
	CGRect bannerFrame = banner.frame;
	bannerFrame.origin.y = statusBarOffset;
	CGRect containerFrame = self.containerView.frame;
	containerFrame.origin.y = bannerFrame.size.height + statusBarOffset;
	containerFrame.size.height = self.view.frame.size.height - bannerFrame.size.height - statusBarOffset;
	[UIView animateWithDuration:1.0 animations:^{
		banner.frame = bannerFrame;
		self.containerView.frame = containerFrame;
	}];
	
	// iAdを画面の下にする.
//	CGRect bannerFrame = banner.frame;
//	bannerFrame.origin.y = self.view.frame.size.height - bannerFrame.size.height;
//	CGRect containerFrame = self.containerView.frame;
//	containerFrame.size.height = self.view.frame.size.height - bannerFrame.size.height;
//	[UIView animateWithDuration:1.0 animations:^{
//		banner.frame = bannerFrame;
//		self.containerView.frame = containerFrame;
//	}];
}

- (void) hideBannerView:(ADBannerView *)banner
{
	// iAdを画面の上にする.
	int statusBarOffset = self.topLayoutGuide.length;
	CGRect bannerFrame = banner.frame;
	bannerFrame.origin.y = -bannerFrame.size.height;
	CGRect containerFrame = self.containerView.frame;
//	containerFrame.origin.y = 0;
	containerFrame.origin.y = statusBarOffset;
	containerFrame.size.height = self.view.frame.size.height - statusBarOffset;
	[UIView animateWithDuration:1.0 animations:^{
		banner.frame = bannerFrame;
		self.containerView.frame = containerFrame;
	}];
	
	// iAdを画面の下にする.
//	CGRect bannerFrame = banner.frame;
//	bannerFrame.origin.y = self.view.frame.size.height;
//	CGRect containerFrame = self.containerView.frame;
//	containerFrame.size.height = self.view.frame.size.height;
//	[UIView animateWithDuration:1.0 animations:^{
//		banner.frame = bannerFrame;
//		self.containerView.frame = containerFrame;
//	}];
}

#pragma mark - iAd delegate

- (void) bannerViewDidLoadAd:(ADBannerView *)banner
{
	[self showBannerView:banner];
	NSLog(@"広告あり");
}

- (void) bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
	[self hideBannerView:banner];
	NSLog(@"広告なし");
}
```