iAd - не может нажать на баннер

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

Этот шаблон должен поддерживать необязательные 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 ответа

Решение

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

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

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

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

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

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

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

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

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

self.window.backgroundColor = [UIColor whiteColor];

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

Другие вопросы по тегам