iAd not showing up after dismissModalViewControllerAnimated

Discussion in 'iOS Programming' started by ppn, Nov 8, 2011.

  1. ppn macrumors member

    Oct 31, 2010
    I used the shared SharedAdBannerView sample code by Apple for implementing iAd. The iAd loads fine on initial launch on the main view as well as the subsequent view controllers when I use the present modal view. It even works when I push through 2 layers of table view (but the table view doesn't have iAd) and finally get to a detailed view controller view.

    But when I go back to the main view using the dismissModalViewController, the iAd is hidden on the main view. I tried debugging and it seems the layoutForCurrentOrientation method below is being called before the main view comes back.

    Does anyone have a similar issue? How to I call the layoutForCurrentOrientation after the dismissModalViewController is done and the main view is done animating?

    - (void)createADBannerView
        // --- WARNING ---
        // If you are planning on creating banner views at runtime in order to support iOS targets that don't support the iAd framework
        // then you will need to modify this method to do runtime checks for the symbols provided by the iAd framework
        // and you will need to weaklink iAd.framework in your project's target settings.
        // See the iPad Programming Guide, Creating a Universal Application for more information.
        // http://developer.apple.com/iphone/library/documentation/general/conceptual/iPadProgrammingGuide/Introduction/Introduction.html
        // --- WARNING ---
        ADBannerView *adBanner = SharedAdBannerView;
    	// Depending on our orientation when this method is called, we set our initial content size.
        // If you only support portrait or landscape orientations, then you can remove this check and
        // select either ADBannerContentSizeIdentifierPortrait (if portrait only) or ADBannerContentSizeIdentifierLandscape (if landscape only).
    	NSString *contentSize;
    	if (&ADBannerContentSizeIdentifierPortrait != nil)
    		contentSize = UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? ADBannerContentSizeIdentifierPortrait : ADBannerContentSizeIdentifierLandscape;
    		// user the older sizes 
    		contentSize = UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? ADBannerContentSizeIdentifier320x50 : ADBannerContentSizeIdentifier480x32;
    	// Calculate the intial location for the banner.
        // We want this banner to be at the bottom of the view controller, but placed
        // offscreen to ensure that the user won't see the banner until its ready.
        // We'll be informed when we have an ad to show because -bannerViewDidLoadAd: will be called.
        CGRect frame;
        frame.size = [ADBannerView sizeFromBannerContentSizeIdentifier:contentSize];
        frame.origin = CGPointMake(0.0f, CGRectGetMaxY(self.view.bounds));
        // Now set the banner view's frame
    	adBanner.frame = frame;
        // Set the delegate to self, so that we are notified of ad responses.
    	adBanner.delegate = self;
        // Set the autoresizing mask so that the banner is pinned to the bottom
        adBanner.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;
    	// Since we support all orientations in this view controller, support portrait and landscape content sizes.
        // If you only supported landscape or portrait, you could remove the other from this set
    	adBanner.requiredContentSizeIdentifiers =
        (&ADBannerContentSizeIdentifierPortrait != nil) ?
        [NSSet setWithObjects:ADBannerContentSizeIdentifierPortrait, ADBannerContentSizeIdentifierLandscape, nil] : 
        [NSSet setWithObjects:ADBannerContentSizeIdentifier320x50, ADBannerContentSizeIdentifier480x32, nil];
        // At this point the ad banner is now be visible and looking for an ad.
        [self.view addSubview:adBanner];
    - (void)layoutForCurrentOrientation:(BOOL)animated
        ADBannerView *adBanner = SharedAdBannerView;
    	CGFloat animationDuration = animated ? 0.2f : 0.0f;
        // by default content consumes the entire view area
        CGRect contentFrame = self.view.bounds;
        // the banner still needs to be adjusted further, but this is a reasonable starting point
        // the y value will need to be adjusted by the banner height to get the final position
    	CGPoint bannerOrigin = CGPointMake(CGRectGetMinX(contentFrame), CGRectGetMaxY(contentFrame));
        CGFloat bannerHeight = 0.0f;
        // First, setup the banner's content size and adjustment based on the current orientation
    	if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
    		adBanner.currentContentSizeIdentifier = (&ADBannerContentSizeIdentifierLandscape != nil) ? ADBannerContentSizeIdentifierLandscape : ADBannerContentSizeIdentifier480x32;
            adBanner.currentContentSizeIdentifier = (&ADBannerContentSizeIdentifierPortrait != nil) ? ADBannerContentSizeIdentifierPortrait : ADBannerContentSizeIdentifier320x50; 
        bannerHeight = adBanner.bounds.size.height;
        // Depending on if the banner has been loaded, we adjust the content frame and banner location
        // to accomodate the ad being on or off screen.
        // This layout is for an ad at the bottom of the view.
        if (adBanner.bannerLoaded || adBannerViewIsVisible == YES)
            contentFrame.size.height -= bannerHeight;
    		bannerOrigin.y -= bannerHeight;
    		bannerOrigin.y += bannerHeight;
        // And finally animate the changes, running layout for the content view if required.
        [UIView animateWithDuration:animationDuration
    //                         contentView.frame = contentFrame;
    //                         [contentView layoutIfNeeded];
                             adBanner.frame = CGRectMake(bannerOrigin.x, bannerOrigin.y, adBanner.frame.size.width, adBanner.frame.size.height);
  2. ArtOfWarfare macrumors G3


    Nov 26, 2007
    I didn't see anything wrong with the above code. I'd think the issue would be with when you either push or pop the modal views, so why not share that code?
  3. ppn thread starter macrumors member

    Oct 31, 2010
    Here's the code for the present and dismiss. I tried debugging it and it finishes calling the layoutForCurrentOrientation before view is actually dismissed and the main view comes back up.

    - (void)quizViewControllerDidFinish:(QuizViewController *)quiz{
    	[self dismissModalViewControllerAnimated:YES];
        if ([[NSUserDefaults standardUserDefaults] boolForKey:kupgradePurchased] == NO && [[NSUserDefaults standardUserDefaults] integerForKey:kquizid] >= 1){
            //        [self.view addSubview:iADBanner];
            [self layoutForCurrentOrientation:NO];
            //        [self.adView resumeAdAutoRefresh];
    - (IBAction)loadQuiz:(id)sender {    
        QuizViewController *quiz = [[QuizViewController alloc] initWithNibName:@"QuizViewController" bundle:nil];
        quiz.delegate = self;
        quiz.adBannerViewIsVisible = adBannerViewIsVisible;
        quiz.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        [self presentModalViewController:quiz animated:YES];
    	[quiz release];

Share This Page