2010-09-08 4 views
11

E 'possibile con una app con root UINavigationController standard avere un singolo ADBannerView visibile nella parte inferiore dello schermo, sotto la gerarchia delle viste? Cioè, senza modificare ogni vista-controller/vista che può essere spinto alla radice UINavigationController, posso avere un ADBannerView globale visibile?ADBannerView globale nell'app per iPhone

Non sono sicuro di come impostarlo, in IB o nel codice. Aiuto?

Vedo domande simili con risposte vaghe. Sto cercando un esempio concreto.

risposta

10

MODIFICA: il modo migliore per farlo in iOS5 + è probabile che utilizzi il contenimento del controller di visualizzazione. Cioè, crea un controller di root che contiene il tuo annuncio e il controller dell'applicazione (nav, tab, ecc.).

Ho trovato un modo per farlo. Ecco cosa ho fatto:

Per il mio primo tentativo ho creato un nuovo controller di visualizzazione chiamato AdBannerController. Per la sua vista ho creato una vista a schermo intero e due sottoview. La prima sottoview (contentView) è per contenuti regolari, la seconda è AdBannerView. Ho usato un'istanza di questo controller di visualizzazione come controller di visualizzazione associato alla finestra dell'app ([window addSubview: adBannerController.view]). Poi ho aggiunto il mio UINavigationController.view come sottoview di adBannerController.view: [adBannerController.contentView addSubview: navigationController.view].

Questo ha funzionato principalmente eccetto che i viewcontrollers inviati a UINavigationController non hanno mai chiamato i loro metodi di volontà/carico/scarico. Shucks. Ho letto in alcuni punti che questo è un sintomo della vista di UINavigationController che non è un diretto discendente della finestra dell'app.

Per il mio secondo tentativo ho preso lo stesso AdBannerController e l'ho derivato da UINavigationController. Questa volta, ho fatto quanto segue in loadview:

- (void)loadView 
{ 
    [super loadView]; 

    _contentView = [self.view retain]; 

    self.view = [[[UIView alloc] initWithFrame: _contentView.frame] autorelease]; 

    [self.view addSubview: _contentView]; 

    _adView = [[ADBannerView alloc] initWithFrame: CGRectMake(0, _contentView.bounds.size.height, 320, 50)]; 
    _adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50; 
    _adView.delegate = self; 

    [self.view addSubview: _adView]; 

    /* for visual debugging of view layout 
    [[_mainView layer] setCornerRadius: 6.0]; 
    [[_mainView layer] setMasksToBounds: YES]; 
    [[_mainView layer] setBorderWidth: 1.5]; 
    [[_mainView layer] setBorderColor: [[UIColor grayColor] CGColor]]; 
    */ 
} 

vedere cosa succede - ho lasciato la superclasse UINavigationController costruire il suo regolare "contenuto" di vista, ma io scambiare fuori e sostituirlo con il mio punto di vista che è un contenitore sia per il contenuto che per le visualizzazioni degli annunci.

Questo funziona abbastanza bene. Sto anche usando il three20 e c'erano alcune cose necessarie per farlo funzionare con quella configurazione, ma non troppo male.

Spero che questo aiuti qualcuno!

+0

Molto utile, ci sto provando ora. – bentford

+1

ho implementato qualcosa di simile ma ho avuto difficoltà nelle visualizzazioni in cui utilizzo UISearchBar come tableViewHeader e nelle viste in cui la navBar è trasparente – coneybeare

+0

Questo sembra funzionare davvero –

3

Nel codice di esempio di sviluppo di Apple il progetto iAdSuite contiene i progetti che hanno fatto ciò per voi. Altamente raccomandato.

+1

Sì, ma non fa quello che l'OP sta chiedendo - invece, l'annuncio nel campione di Apple scorre con le sottoview, e di nuovo indietro quando si utilizza il pulsante "Indietro" –

+0

Ovviamente, se il controller di visualizzazione che gestisce gli annunci viene inserito nello stack e successivamente rimosso, sostituirò il controller di visualizzazione che l'app delegherà e la finestra utilizzerà con l'annuncio gestire r, quindi aggiungi la gerarchia della vista sotto quella. – JoePasq

2

A mio controller della vista root (w/ADBannerViewDelegate) ha installato la mia bandiera aggiungendolo alla vista del controller di navigazione, che la mantiene in cima a tutti i tempi:

banner = [[ADBannerView alloc] init]; 
banner.delegate = self; 
banner.frame = CGRectMake(0.0, 430.0, banner.frame.size.width, banner.frame.size.height); 
[self.navigationController.view addSubview:banner]; 

Nota si dovrà commentare layoutAnimated nel metodo delegato bannerViewDidLoadAd come cercherà di spostare la visualizzazione dell'annuncio up:

- (void)bannerViewDidLoadAd:(ADBannerView *)banner 
{ 
    //[self layoutAnimated:YES]; 
} 
0

ho adattato l'approccio proposto nella iAdSuite qui proposta

http://developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/Intro.html

Ho scaricato il codice e focalizzato sull'esempio della "scheda".Ho copiato su BannerViewController.h/.m come è nel mio progetto.

Ho creato tutte le mie viste nel solito modo con l'approccio dello storyboard. Tuttavia, nella mia classe AppDelegate ho quindi avuto accesso alla barra delle schede già costruita, che conteneva tutti i viewControllers costruiti nello storyboard.

La classe AppDelegate implementa il protocollo TabBarControllerDelegate:

@interfaceAppDelegate : UIResponder <UITabBarControllerDelegate, UIApplicationDelegate> 

Procedimento didFinishLaunchingWithOptions attuazione AppDelegate afferra barra delle linguette pre-costruita, impostando il suo delegato sé (ad esempio la classe AppDelegate).

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: 
// ---------------------------------------------------------- 
// Set the TabBarController delegate to be 'self' 
// ---------------------------------------------------------- 
_tabBarController = (UITabBarController*)self.window.rootViewController; 

// tabController.selectedIndex = [defaults integerForKey:kOptionLastTabSelectedKey]; 
_tabBarController.delegate = self; 

// update tab bar per iAdSuite approach 
[self updateiAd]; 

ho poi costruito una nuova serie di controllori per l'approccio iAdSuite e ripristinare la barra delle schede con questi nuovi elementi barra delle schede.

-(void)updateiAd { 
NSArray* viewControllers = [_tabBarController viewControllers]; 
NSMutableArray*newViewControllers = [[NSMutableArray alloc] init]; 
BannerViewController*bvc=NULL; 
for(UIViewController * vc in viewControllers) { 
    bvc = [[BannerViewController alloc] initWithContentViewController:vc]; 
    [newViewControllers addObject:bvc]; 
} 

// set the new view controllers, replacing the original set 
[_tabBarController setViewControllers:newViewControllers]; 
} 

Questo approccio mette lo stesso 'annuncio' in fondo a ogni vista, esattamente come aveva bisogno. Dovevo anche impostare il titolo della vista nel metodo viewDidLoad di ogni viewController personalizzato (in qualche modo, impostarlo sull'elemento della barra non sembrava funzionare, non aveva impostato l'immagine, ma in seguito potrebbe riflettere un problema con le mie immagini).

La mia configurazione originale è stato

      TabViewController 

NavController1    NavController2   NavController3 ... 
     |       |      | 
CustomViewController1  CustomViewController2  CustomViewController3 

La mia configurazione finale è ora

      TabViewController 

NavController1    NavController2   NavController3 ... 
    |       |      | 
iAdView1       iAdView2    iAdView3 
    |       |      | 
CustomViewController1  CustomViewController2  CustomViewController3 

In termini di vista del ciclo di vita, devo aggiungere che solo i NavControllers sono in atto al momento il metodo updateiAd è chiamato.

I singoli CustomViewControllers1/2/3/etc vengono creati dopo il completamento della chiamata.