iAd——无法点击横幅

发布于 2024-10-27 15:53:36 字数 4702 浏览 1 评论 0原文

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

该模板需要支持可选的 iAd,以及所有方向(可选)。

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

然后我重新编码了另一个版本,整理了所有内容,并删除了大部分代码以揭示最小的测试用例失败。

https://github.com/pi-/iAdUniversalTemplate/commit/2c829d268a9452e1a054802e7ccb9cde5de1 7853

在此新代码,只有 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
}

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

I am creating a universal-app template.

This template will need to support optional iAds, and optionally all orientations.

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/p-i-/iAdUniversalTemplate/commit/2c829d268a9452e1a054802e7ccb9cde5de17853

In this new code, only 3 views: window, uberview (the view controller's view), and the ad-banner

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)

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.

Juicy code chunks:

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
}

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

獨角戲 2024-11-03 15:53:36

这是一个非常糟糕的错误,

我最终不得不使用我的 2 个 ITS 帮助热线事件中的一个,并为此损失了整整一周的工作时间。

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

这是 XIB magic 完成的事情之一

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

但这是UIKit中的一个BUG。苹果公司的 ITS 代表告诉我要这样做,我已经这样做了。

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.

Setting the uberView's backgroundColor property to ANYTHING non-nil fixes the problem.

This is one of the things that gets done by XIB magic

There is a tool called nib2objc that converts XIB into code. 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.

But this is a BUG in UIKit. Apple's ITS rep told me to file it does such, which I have done.

楠木可依 2024-11-03 15:53:36

我遇到了同样的问题,但是使用 [UIColor clearColor] 作为超级视图的背景没有帮助。 (这是在 iOS 4.3.3 上)

所有超级视图都需要有一个不透明颜色集。

I had the same problem, but using [UIColor clearColor] for the superview's background did not help. (This is on iOS 4.3.3)

All the superviews need to have an opaque color set.

蹲墙角沉默 2024-11-03 15:53:36

我确实确认添加

self.window.backgroundColor = [UIColor whiteColor];

didFinishLaunchingWithOptions 函数效果很好。

I do confirm that adding

self.window.backgroundColor = [UIColor whiteColor];

in didFinishLaunchingWithOptions function works perfectly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文