0

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];
}
4

0 に答える 0