iAd - 无法点击横幅 [英] iAd -- cannot click banner

查看:168
本文介绍了iAd - 无法点击横幅的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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



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



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



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



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



因此,横幅显示正确后,自动旋转工作正常...
我已记录框架并为每个框架设定边界,并且一切都应该如此。



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



可能出现什么问题?我开始怀疑在将XIB从项目中删除并实现窗口并从代码中查看控制器时,我已经错过了一些东西或将某些东西连接到前面。



多汁代码块:



AppDelegate.m

   - (BOOL)应用程序:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@ - > ___ PROJECTNAME ___ AppDelegate:didFinishLaunchingWithOptions ...);

// FIXED:现在info.plist中的条目隐藏SB BEFORE启动
[[UIApplication sharedApplication] setStatusBarHidden:(SHOW_SB?NO:YES)];

CGRect appFrame = [UIScreen mainScreen] .applicationFrame;

// windowRect必须从0开始,0
// if(SHOW_SB == YES),appFrame将是'{{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];

//触发loadView
[self.window makeKeyAndVisible];

返回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 Ba​​nner

// - - - - - - - - - - - - - - - - - - - - - - - - - -

- (无效)bannerViewDidLoadAd:(ADBannerView *)banner
{
if(!showingBanner)
{
showingBanner =是;
// ...(可选择动画)
}
}


// - - - - - - - - - - - - - - - - - - - - - - - - - -

- (void)bannerView:(ADBannerView *)banner
didFailToReceiveAdWithError:(NSError *)error
{
NSLog(@FAIL);

if(showingBanner)
{
showingBanner = NO;
// ...(可选择动画输出)
}
}

// - - - - - - - - - - - - - - - - - - - - - - - - - -

- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner
willLeaveApplication:(BOOL)将离开
{
返回YES ; //不会被击中
}

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


解决方案

这是一个讨厌的错误



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



设置uberView的backgroundColor属性为ANYTHING非零修复问题。



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



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



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


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
}

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

解决方案

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.

这篇关于iAd - 无法点击横幅的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆