iAd - не может нажать на баннер - PullRequest
6 голосов
/ 29 марта 2011

Я создаю шаблон универсального приложения.

Этот шаблон должен поддерживать дополнительные iAds и, при необходимости, все ориентации.

Я кодировал решение только для того, чтобы найти причудливую ошибку. в определенных ситуациях мне не удавалось нажать на баннер

Затем я перекодировал еще одну ревизию, все привел в порядок и выполнил большую часть кода, чтобы выявить минимальный сбой тестового примера.

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

В этом новом коде только 3 вида: окно, uberview (вид контроллера представления) и рекламный баннер

Итак, баннер отображается правильно, как только его обслужили, автоповорот работает нормально ... Я записал рамки и границы для каждого, и все так, как и должно быть.

Но он не отвечает на нажатие (ну, нажмите, потому что я в симуляторе)

Что может быть не так? Я начинаю подозревать, что, вырезая XIB из проекта и реализуя контроллер окна и представления из кода, я что-то упустил или что-то подключил обратно вперед.

Сочные куски кода:

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
}

// = = = = = = = = = = = = = = = = = = = = = = = = = = 

Ответы [ 3 ]

8 голосов
/ 04 апреля 2011

Это была ошибка, чтобы обмануть

Мне пришлось использовать один из двух инцидентов, связанных с горячей линией ITS, и я потерял на нем целую рабочую неделю.

Установка для свойства backgroundColor uberView значения НИЧЕГО, кроме nil, решает проблему.

Это одна из вещей, которую делает магия XIB

Существует инструмент под названием nib2objc, который преобразует XIB в код. это был бы следующий шаг, если бы мне пришлось отлаживать его самому, чтобы фактически увидеть, что содержится в стандартном Apple XIB, и увидеть, что я не могу реализовать вручную.

Но это ошибка в UIKit. Представитель Apple в ITS сказал мне, чтобы она делала это, что я и сделал.

2 голосов
/ 01 июня 2011

У меня была такая же проблема, но использование [UIColor clearColor] для фона суперпредставления не помогло. (Это на iOS 4.3.3)

Все суперпредставления должны иметь непрозрачный набор цветов.

0 голосов
/ 26 апреля 2012

Я подтверждаю, что добавление

self.window.backgroundColor = [UIColor whiteColor];

in didFinishLaunchingWithOptions Функция работает отлично.

...