UITabBarController と UINavigationController と一連の UITableView ベースの画面を使用して iAds を iOS 6 アプリに統合していますが、ほとんどの場合、1 つの明白な例外があります。親から子のビュー コントローラーに移動すると、広告が既にある場合でも、(新しい広告が配信されたときに) ADBannerView デリゲート メソッドが呼び出されるまで、バナー ビューが表示されません。
私が望むのは、親に広告を表示し、子をクリックすると、すぐに広告が表示されるようにすることです。ただし、デリゲート メソッドが呼び出されて更新されるまで、広告バナーが消えて再表示されます。デバッガーをステップ実行すると、すべてが機能するように見えます。それは私がやっていない些細なことだと確信していますが、立ち往生しています。ヘルプ!
コメントにあるように、コードが広告をビューに配置している時点で、_contentView フレーム サイズが正しくないようです。自動レイアウトをオフにすると、最初は広告が正しく配置されますが、新しい広告ごとにバナーが画面の上に移動します。自動レイアウトをオンにすると、広告の最初の表示は間違った場所に表示されますが、その後の呼び出し (またはローテーション呼び出し) では広告は正しい場所に表示されます。
関連するコードは次のとおりです。
共有したい ADBannerView インスタンスの作成を管理するシングルトン クラスがあります。シングルトンは割り当てを 1 回だけ行います。それ以外の場合は、バナー ビューを返します。
- (ADBannerView *) getAdBannerSingleton
{
if ( bannerView == nil )
{
DDLogInfo(@"iAds: Creating our initial banner view") ;
bannerView = [[ADBannerView alloc] initWithAdType:ADAdTypeBanner] ;
// to handle rotation properly
[bannerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth] ;
}
return bannerView ;
}
View --> SubView --> UITableView (XIB 内) を持ち、ADBannerView を管理し、デリゲートとして機能する基本クラスがあります。私の具体的な親/子クラスは基本クラスから継承しますが、それ自体は特別なことは何もしません (彼らは幸いにも広告を認識していません)。
@implementation SSSAdEnabledTableViewController
@synthesize tableView = _tableView;
@synthesize contentView = _contentView;
@synthesize bannerView = _bannerView ;
- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil] ;
// this class does not need to do anything special as there are no concrete instances of it
return self ;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//
// manage our ad
//
DDLogInfo(@"iAds: Managing ad View from viewWillAppear for %@",
NSStringFromClass([self class])) ;
[self manageAdView] ;
}
- (void) viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated] ;
// no effect with our without the call below
[_bannerView removeFromSuperview];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[_tableView setAutoresizesSubviews:YES] ;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
self.contentView = nil ;
self.tableView = nil ;
self.bannerView = nil ;
}
#pragma mark -- iAd framework methods
- (void) bannerViewDidLoadAd:(ADBannerView *)banner
{
DDLogInfo(@"iAds: Banner ad successfully loaded for %@", NSStringFromClass([self class])) ;
[self manageAdView] ;
}
- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
{
return YES ;
}
- (void)bannerViewActionDidFinish:(ADBannerView *)banner
{
// don't think we have to do anything?
}
- (void) bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
DDLogError(@"Error loading iAd for %@. Reason: %@",
NSStringFromClass([self class]),
[error localizedDescription]) ;
[self manageAdView] ;
}
#pragma mark -- ad banner helper methods
//
// Get our shared banner view instance
//
- (void)createAdBannerView
{
// get the banner view instance
_bannerView = [[SSSStoreManager sharedStore] getAdBannerSingleton] ;
// make us the delegate
DDLogInfo(@"iAds: Setting %@ to be our banner delegate", NSStringFromClass([self class])) ;
// set it to be the delegate
[_bannerView setDelegate:self] ;
}
//
// Based on the ad status, make room for it in our view or hide it
//
- (void)manageAdView
{
// make sure we always have a banner view to work with here
if ( _bannerView == nil )
{
DDLogInfo(@"Banner View is Nil; Creating it for %@", NSStringFromClass([self class]));
[self createAdBannerView] ;
}
// will hold our banner dimensions and position
CGRect bannerFrame = CGRectZero;
// our inner view dimensions and position
CGRect contentViewFrame = _contentView.frame;
// make sure all of the changes happen at one time
[UIView beginAnimations:@"fixupViews" context:nil];
// is the banner loaded and should it be visible?
if ( _bannerView.bannerLoaded == YES )
{
DDLogInfo(@"iAds: Showing banner view for %@", NSStringFromClass([self class])) ;
bannerFrame.size = [_bannerView sizeThatFits:contentViewFrame.size];
contentViewFrame.size.height -= bannerFrame.size.height;
bannerFrame.origin.y = contentViewFrame.size.height;
}
else
{
DDLogInfo(@"iAds: Hiding banner view for %@", NSStringFromClass([self class])) ;
bannerFrame.origin.y = contentViewFrame.size.height;
}
// reset our content view based on whether we have an ad to show
_contentView.frame = contentViewFrame ;
[self.view addSubview:_bannerView];
_bannerView.frame = bannerFrame;
[UIView commitAnimations];
}