iAd - 无法点击横幅

P i*_*P i 6 iphone templates xib universal iad

我正在创建一个通用应用程序模板.

此模板需要支持可选的iAd,以及可选的所有方向.

我编写了一个解决方案,但却发现了一个奇怪的错误.在某些情况下,我无法点击横幅

然后我重新编写了另一个版本,整理了所有内容,并将大部分代码排除在外,以显示最小的测试用例失败.

https://github.com/pi-/iAdUniversalTemplate/commit/2c829d268a9452e1a054802e7ccb9cde5de17853

在这个新代码中,只有3个视图:window,uberview(视图控制器的视图)和广告横幅

因此,横幅一旦显示就会正常显示,自动旋转工作正常...我已经记录了框架并为每个框架设定了界限,一切都是应有的.

但它没有响应tap(嗯,点击因为我在模拟器中)

什么可能是错的?我开始怀疑在将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;
}
Run Code Online (Sandbox Code Playgroud)

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
}

// = = = = = = = = = = = = = = = = = = = = = = = = = = 
Run Code Online (Sandbox Code Playgroud)

P i*_*P i 8

这是一个惹恼的臭虫

我最终不得不使用我的2个ITS帮助热线事件中的一个,并且在一周内失去了整整一个工作周.

将uberView的backgroundColor属性设置为ANYTHING非零可以解决问题.

这是XIB魔术所完成的事情之一

有一个名为nib2objc的工具可以将XIB转换为代码.如果我必须自己调试它,实际上看看Apple的默认XIB中包含的内容,看看我未能手动实现的内容,这将是下一步.

但这是UIKit的一个BUG.Apple的ITS代表告诉我提交它,我已经做过了.