2010-09-08 11 views
11

¿Es posible con una aplicación estándar UINavigationController-rooteada, tener un solo ADBannerView visible en la parte inferior de la pantalla, debajo de la jerarquía de vista? Es decir, sin modificar cada view-controller/view que se puede insertar en el UINavigationController raíz, ¿puedo tener un ADBannerView global visible?global ADBannerView en la aplicación para iPhone

No estoy seguro de cómo configurar esto, ya sea en IB o en código. ¿Ayuda?

Veo preguntas similares con respuestas vagas. Estoy buscando un ejemplo concreto.

Respuesta

10

EDITAR: La mejor manera de hacer esto en iOS5 + es probable que use la contención del controlador de vista. Es decir, crea un controlador raíz que contenga tu anuncio y el controlador de la aplicación (navegación, pestaña, etc.).

Descubrí una forma de hacerlo. Esto es lo que hice:

Para mi primer intento, creé un nuevo controlador de vista llamado AdBannerController. Para su vista, creé una vista de pantalla completa y dos subvistas. La primera subvista (contentView) es para contenido regular, la segunda es AdBannerView. Utilicé una instancia de este controlador de vista como el controlador de vista asociado a la ventana de la aplicación ([window addSubview: adBannerController.view]). Luego agregué mi UINavigationController.view como una subvista de adBannerController.view: [adBannerController.contentView addSubview: navigationController.view].

Esto funcionó en su mayoría, excepto que los controladores de vista enviados al UINavigationController nunca obtuvieron sus métodos will/did-load/download llamados. Shucks. Leí en algunos lugares que este es un síntoma de que la vista UINavigationController no es un descendiente directo de la ventana de la aplicación.

Para mi segundo intento tomé el mismo AdBannerController y lo obtuve de UINavigationController. Esta vez, hizo lo siguiente en 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]]; 
    */ 
} 

Aviso lo que sucede - dejo que la superclase UINavigationController construir su "contenido" vista normal, pero yo intercambiar hacia fuera y reemplazarlo con mi propio punto de vista que es un contenedor tanto para el contenido como para las vistas de anuncios.

Esto funciona bastante bien. También estoy usando Three20 y se necesitan algunas cosas para que esto funcione con esa configuración, pero no está mal.

Espero que esto ayude a alguien!

+0

Muy útil, estoy intentando esto ahora. – bentford

+1

Implementé algo como esto pero tuve dificultades en las vistas donde estoy usando un UISearchBar como el TableViewHeader, así como en las vistas donde el navBar es transparente – coneybeare

+0

Esto realmente parece funcionar –

3

En el código de ejemplo de desarrollo de Apple, el proyecto iAdSuite contiene los proyectos que tienen esto hecho para usted. Muy recomendable.

+1

Sí, pero no hace lo que el OP está pidiendo, en cambio, el anuncio en la muestra de Apple se desliza con las subvistas, y volverá a salir cuando use el botón "Atrás" –

+0

Por supuesto, si el controlador de vista que administra los anuncios se inserta en la pila y luego se elimina, reemplazaría el controlador de vista que la aplicación delega y utiliza con el anuncio gestionar r, luego agrega la jerarquía de vista debajo de eso. – JoePasq

2

En mi controlador de vista raíz (w/ADBannerViewDelegate) I fijó mi bandera añadiéndolo a la vista del controlador de navegación, que lo mantiene en la parte superior en todo momento:

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 Tendrá que comente layoutAnimated en el método delegado bannerViewDidLoadAd ya que tratará de mover la vista del anuncio arriba:

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

me adaptado el enfoque sugerido en la iAdSuite dada aquí

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

He descargado el código y me he centrado en el ejemplo de 'pestaña'.Copié sobre el BannerViewController.h/.m como está en mi proyecto.

Creé todos mis puntos de vista de la manera habitual con el enfoque del guión gráfico. Sin embargo, en mi clase de AppDelegate, accedí a la barra de pestañas ya construida, que contiene todos los viewControllers construidos en el storyboard.

La clase AppDelegate implementa el protocolo TabBarControllerDelegate:

@interfaceAppDelegate : UIResponder <UITabBarControllerDelegate, UIApplicationDelegate> 

El método didFinishLaunchingWithOptions implementación AppDelegate agarra la barra de pestañas pre-construido, el establecimiento de su delegado a la libre (por ejemplo, la clase 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]; 

entonces construyeron un nuevo conjunto de controladores por el enfoque iAdSuite y restablecer la barra de pestañas con estos nuevos elementos de la barra de pestañas.

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

Este enfoque coloca el mismo 'anuncio' en la parte inferior de cada vista, exactamente como sea necesario. También tuve que establecer el título de la vista en el método viewDidLoad de cada viewController personalizado (de alguna manera, configurarlo en el elemento de la barra no parecía funcionar, no configuró la imagen, pero el último puede reflejar un problema con mis imágenes).

Mi configuración original

      TabViewController 

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

Mi configuración final es ahora

      TabViewController 

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

En términos de vista del ciclo de vida, debo añadir que sólo los NavControllers están en existencia en el momento en el método updateiAd es llamado.

Los CustomViewControllers1/2/3/etc individuales se crean después de que se completa la llamada.

Cuestiones relacionadas