2011-03-29 7 views
6

Estoy creando una plantilla de aplicación universal.iAd: no se puede hacer clic en banner

Esta plantilla deberá admitir iAds opcionales y, opcionalmente, todas las orientaciones.

He codificado una solución solo para encontrar un error extraño. en ciertas situaciones no pude hacer clic en el banner

Luego grabé otra revisión, ordené todo y aniquilé la mayor parte del código para revelar un error mínimo en la prueba.

https://github.com/p-i-/iAdUniversalTemplate/commit/2c829d268a9452e1a054802e7ccb9cde5de17853

En este nuevo código, sólo 3 puntos de vista: Ventana, uberview (vista del controlador de vista), y el anuncio banner

Así, los banners se muestra correctamente una vez que se ha servido, autorrotación funciona bien ... He registrado el marco y los límites para cada uno, y todo está como debe ser.

Pero no está respondiendo a tocar (así, haga clic porque estoy en el simulador)

Qué podría estar mal? Estoy empezando a sospechar que al cortar el XIB del proyecto y al implementar la ventana y ver el controlador desde el código, me he perdido algo o he conectado algo de vuelta al frente.

trozos de código jugosas:

AppDelegate.m

- (BOOL) application: (UIApplication *) application 
didFinishLaunchingWithOptions: (NSDictionary *) launchOptions 
{ 
    NSLog(@"--> ___PROJECTNAME___AppDelegate:didFinishLaunchingWithOptions..."); 

    // FIXED: now entry in info.plist hides SB BEFORE launch 
    [[UIApplication sharedApplication] setStatusBarHidden: (SHOW_SB ? NO : YES)]; 

    CGRect appFrame = [UIScreen mainScreen].applicationFrame; 

    // windowRect must start at 0, 0 
    // if (SHOW_SB == YES), appFrame will be '{{0, 20}, {320, 460}}' 
    CGRect windowRect = CGRectMake(0, 0, appFrame.size.width, appFrame.size.height); 

    self.window = [[[UIWindow alloc] initWithFrame: windowRect] autorelease]; 

    self.viewController = [ [ [ ___PROJECTNAME___ViewController alloc ] init ] autorelease ]; 

    [self.window setRootViewController: viewController]; 

    // triggers loadView 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

iAdVC.m

- (void) loadView 
{  
    self.uberView = [[[UIView alloc] initWithFrame: [UIScreen mainScreen].applicationFrame] autorelease]; 
    self.uberView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    self.uberView.autoresizesSubviews = YES; 
    self.uberView.clipsToBounds = YES; 

    //UIWindow * w = self.view.window; 
    //w.clipsToBounds = YES; 

    [self setView: uberView]; 

    showingBanner = NO; 
    adBannerView = nil; 
    if (IADS_ENABLED) 
    { 
     NSString * P = ADBannerContentSizeIdentifierPortrait; 
     NSString * L = ADBannerContentSizeIdentifierLandscape; 

     self.adBannerView = [[[ADBannerView alloc] initWithFrame:CGRectZero] autorelease]; 

     self.adBannerView.delegate = self; 
     self.adBannerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin; 
     self.adBannerView.requiredContentSizeIdentifiers = [NSSet setWithObjects: P, L, nil]; 
     self.adBannerView.currentContentSizeIdentifier = UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? P : L ; 

     [uberView addSubview: adBannerView]; 
    } 

    UIWindow * w = [[UIApplication sharedApplication] keyWindow]; 

    w.userInteractionEnabled = YES; 
    self.uberView.userInteractionEnabled = YES; 
    self.adBannerView.userInteractionEnabled = YES; 

    w.clipsToBounds = YES; 
    self.uberView.clipsToBounds = YES; 
    self.adBannerView.clipsToBounds = YES; 

    w.opaque = YES; 
    self.uberView.opaque = YES; 
    self.adBannerView.opaque = YES; 
} 

// - - - - - - - - - - - - - - - - - - - - - - - - - - 

#pragma mark Autorotate 

- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation 
{ 
    return YES; 
} 

// - - - - - - - - - - - - - - - - - - - - - - - - - - 

- (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) newOrientation 
           duration: (NSTimeInterval) duration 
{ 
    bool isLandscape = UIInterfaceOrientationIsLandscape(newOrientation); 
    self.adBannerView.currentContentSizeIdentifier = isLandscape ? ADBannerContentSizeIdentifierLandscape : ADBannerContentSizeIdentifierPortrait ; 
} 


#pragma mark Banner 

// - - - - - - - - - - - - - - - - - - - - - - - - - - 

- (void) bannerViewDidLoadAd: (ADBannerView *) banner 
{ 
    if (! showingBanner) 
    { 
     showingBanner = YES; 
     // ... (optionally animate in) 
    } 
} 


// - - - - - - - - - - - - - - - - - - - - - - - - - - 

- (void) bannerView: (ADBannerView *) banner 
didFailToReceiveAdWithError: (NSError *) error 
{ 
    NSLog(@"FAIL"); 

    if (showingBanner) 
    { 
     showingBanner = NO; 
     // ... (optionally animate out) 
    } 
} 

// - - - - - - - - - - - - - - - - - - - - - - - - - - 

-(BOOL) bannerViewActionShouldBegin: (ADBannerView *) banner 
       willLeaveApplication: (BOOL) willLeave 
{ 
    return YES; // doesnt get hit 
} 

// = = = = = = = = = = = = = = = = = = = = = = = = = = 
+0

¿Ha intentado agregar el banner al centro de la ventana (alimentar el CGRect adecuado en initWithFrame), solo para asegurarse de que no esté oscurecido por alguna otra vista invisible que pueda estar agregando en otro lugar? – SVD

Respuesta

8

Esta era una perra de un error de Blat

Terminé teniendo que usar uno de mis 2 incidentes de la línea de ayuda ITS y perdí una semana completa de trabajo en él.

Al establecer la propiedad backgroundColor de uberView en CUALQUIER COSA que no sea nula se soluciona el problema.

Ésta es una de las cosas que se hace por la magia XI ter

Hay una herramienta llamada nib2objc que convierte en código XI ter. este hubiera sido el próximo paso si tuviera que depurarlo yo mismo, ver realmente lo que está contenido en el XIB predeterminado de Apple, y ver lo que estoy fallando en implementar manualmente.

Pero esto es un ERROR en UIKit. El representante de ITS de Apple me dijo que archivara eso, lo que hice.

+0

Esto funcionó! Gracias :-) – MrDatabase

+0

¡Gracias! Nunca hubiera adivinado que tuviera algo que ver con el color de fondo. Solo pasé varias horas tratando de resolver esto. – briangraf

+0

Nunca pensé que establecer el color de fondo del banner para borrar lo dejaría de funcionar, ¡gracias! –

2

Tuve el mismo problema, pero usar [UIColor clearColor] para el fondo de la supervista no ayudó. (Esto está en iOS 4.3.3)

Todas las supervistas deben tener un conjunto de colores opaco.

0

que sí confirman que la adición de

self.window.backgroundColor = [UIColor whiteColor]; 

en didFinishLaunchingWithOptions función funciona perfectamente.

Cuestiones relacionadas