简体   繁体   English

iAd - 无法点击横幅

[英]iAd — cannot click banner

I am creating a universal-app template. 我正在创建一个通用应用程序模板。

This template will need to support optional iAds, and optionally all orientations. 此模板需要支持可选的iAd,以及可选的所有方向。

I coded up a solution only to find a bizarre bug. 我编写了一个解决方案,但却发现了一个奇怪的错误。 in certain situations I was unable to click on the banner 在某些情况下,我无法点击横幅

I then recoded another revision, tidied everything, and gutted out most of the code to reveal a minimal test case failure. 然后我重新编写了另一个版本,整理了所有内容,并将大部分代码排除在外,以显示最小的测试用例失败。

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

In this new code, only 3 views: window, uberview (the view controller's view), and the ad-banner 在这个新代码中,只有3个视图:window,uberview(视图控制器的视图)和广告横幅

So, the banner displays properly once it has been served, autorotation works fine... I have logged the frame and bounds for each, and everything is as it should be. 因此,横幅一旦显示就会正常显示,自动旋转工作正常...我已经记录了框架并为每个框架设定了界限,一切都是应有的。

But it is not responding to tap (well, click because I am in the simulator) 但它没有响应tap(嗯,点击因为我在模拟器中)

What could possibly be wrong? 什么可能是错的? I'm starting to suspect that in cutting the XIB out of the project and implementing the window and view controller from code, I have missed something out or wired something up back to front. 我开始怀疑在将XIB从项目中删除并实现窗口并从代码中查看控制器时,我已经错过了一些东西或将某些内容连接到前面。

Juicy code chunks: 多汁的代码块:

AppDelegate.m 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 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
}

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

This was a bitch of a bug to blat 这是一个惹恼的臭虫

I ended up having to use one of my 2 ITS helpline incidents, and lost a full working week on it. 我最终不得不使用我的2个ITS帮助热线事件中的一个,并且在一周内失去了整整一个工作周。

Setting the uberView's backgroundColor property to ANYTHING non-nil fixes the problem. 将uberView的backgroundColor属性设置为ANYTHING非零可以解决问题。

This is one of the things that gets done by XIB magic 这是XIB魔术所完成的事情之一

There is a tool called nib2objc that converts XIB into code. 有一个名为nib2objc的工具可以将XIB转换为代码。 this would have been the next step if I had to debug it myself, to actually see what is contained in Apple's default XIB, and see what I'm failing to implement manually. 如果我必须自己调试它,实际上看看Apple的默认XIB中包含的内容,看看我未能手动实现的内容,这将是下一步。

But this is a BUG in UIKit. 但这是UIKit的一个BUG。 Apple's ITS rep told me to file it does such, which I have done. Apple的ITS代表告诉我提交它,我已经做过了。

I had the same problem, but using [UIColor clearColor] for the superview's background did not help. 我有同样的问题,但使用[UIColor clearColor]作为superview的背景并没有帮助。 (This is on iOS 4.3.3) (这是在iOS 4.3.3上)

All the superviews need to have an opaque color set. 所有超级视图都需要具有不透明的颜色集。

I do confirm that adding 我确认添加

self.window.backgroundColor = [UIColor whiteColor];

in didFinishLaunchingWithOptions function works perfectly. didFinishLaunchingWithOptions函数中运行完美。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM