servidor mail apple iphone uinavigationcontroller iad

apple - mail zimbra iphone



ADBannerView global en la aplicaciĆ³n de iPhone (4)

¿Es posible con una aplicación estándar UINavigationController-rooted, 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?

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.


En el código de ejemplo de desarrollo de Apple, el proyecto iAdSuite contiene los proyectos que lo han hecho por usted. Muy recomendable.


En mi controlador de vista raíz (w / ADBannerViewDelegate) configuro mi banner añadiéndolo a la vista del controlador de navegación, que lo mantiene encendido 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];

Tenga en cuenta que tendrá que comentar layoutAnimated en el método delegado bannerViewDidLoadAd ya que intentará mover la vista del anuncio hacia arriba:

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


Adapte el enfoque sugerido en el iAdSuite dado aquí

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

Descargué el código y me centré 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>

La implementación de AppDelegate didFinishLaunchingWithOptions método agarra el tabBar preconstruido, configurando su delegado a sí mismo (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];

Luego construí un nuevo conjunto de controladores según el enfoque de iAdSuite y restablecí 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 era

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 ciclo de vida de la vista, debo agregar que solo existen los NavControllers en el momento en que se llama al método updateiAd.

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


EDITAR: La mejor forma de hacer esto en iOS5 + es usar el 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 hacer esto. Aquí esta 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 empujados 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, hice 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]]; */ }

Observe lo que sucede: dejo que la superclase UINavigationController construya su vista regular de "contenido", pero la cambio y la reemplazo con mi propia 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!