隐藏/显示Spritekit中的iAds

我一直想弄清楚如何在我的Spritekit场景中隐藏和显示iAds。 目前我有这样的设置:

ViewController.h

#import <UIKit/UIKit.h> #import <SpriteKit/SpriteKit.h> #import <iAd/iAD.h> @interface ViewController : UIViewController <ADBannerViewDelegate> { ADBannerView *adView; } -(void)showsBanner; -(void)hidesBanner; @end 

ViewController.m

 #import "ViewController.h" #import <UIKit/UIKit.h> #import <iAd/iAD.h> #import "MyScene.h" #import <SpriteKit/SpriteKit.h> @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Configure the view. SKView * skView = (SKView *)self.view; skView.showsFPS = NO; skView.showsNodeCount = NO; // Create and configure the scene. SKScene * scene = [MyScene sceneWithSize:skView.bounds.size]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; self.canDisplayBannerAds = YES; adView = [[ADBannerView alloc] initWithFrame:CGRectZero]; adView.frame = CGRectOffset(adView.frame, 0, 0.0f); adView.delegate=self; [self.view addSubview:adView]; self.bannerIsVisible=NO; } -(void)bannerViewDidLoadAd:(ADBannerView *)banner { if (!self.bannerIsVisible) { [UIView beginAnimations:@"animatedAdBannerOn" context:NULL]; banner.frame = CGRectOffset(banner.frame, 0.0, 0.0); [UIView commitAnimations]; self.bannerIsVisible = YES; }} -(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error { if (!self.bannerIsVisible) { [UIView beginAnimations:@"animatedAdBannerOff" context:NULL]; banner.frame = CGRectOffset(banner.frame, 0.0, 0.0); [adView setAlpha:0]; [UIView commitAnimations]; self.bannerIsVisible = NO; } } -(void)hidesBanner { NSLog(@"HIDING BANNER"); [adView setAlpha:0]; self.bannerIsVisible = NO; } -(void)showsBanner { NSLog(@"SHOWING BANNER"); [adView setAlpha:1]; self.bannerIsVisible = YES; } etc... @end 

然后在我的场景中,我用一个指针抓住viewcontroller:

 ViewController *controller; controller = [[ViewController alloc] init]; [controller hidesBanner]; 

我的nslog在控制台中运行,所以我知道它正在经历。 但横幅不会隐藏。 有什么想法吗? 我非常新的目标,所以我有一种感觉,我只是在做一些愚蠢的事情。

就像Huygamer说的,你正在创build一个视图控制器的新实例,所以当你调用你的方法[controller hidesBanner]; 你指的是另一个对象。

这里最好的方法是使用NSNotificationCenter : https : //developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

每当您想隐藏或显示您的广告时,都会向您的viewcontroller发送一条消息:

ViewController.m

  - (void)viewDidLoad { [super viewDidLoad]; //Add view controller as observer [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"hideAd" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"showAd" object:nil]; // Configure the view. SKView * skView = (SKView *)self.view; skView.showsFPS = NO; skView.showsNodeCount = NO; // Create and configure the scene. SKScene * scene = [MyScene sceneWithSize:skView.bounds.size]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; self.canDisplayBannerAds = YES; adView = [[ADBannerView alloc] initWithFrame:CGRectZero]; adView.frame = CGRectOffset(adView.frame, 0, 0.0f); adView.delegate=self; [self.view addSubview:adView]; self.bannerIsVisible=NO; } //Handle Notification - (void)handleNotification:(NSNotification *)notification { if ([notification.name isEqualToString:@"hideAd"]) { [self hidesBanner]; }else if ([notification.name isEqualToString:@"showAd"]) { [self showBanner]; } } 

而在你的场景中:

  [[NSNotificationCenter defaultCenter] postNotificationName:@"showAd" object:nil]; //Sends message to viewcontroller to show ad. [[NSNotificationCenter defaultCenter] postNotificationName:@"hideAd" object:nil]; //Sends message to viewcontroller to hide ad. 

当然,有2个对象,为什么你认为它可以做?

如果你想访问skscene的父母只是做到这一点

UIViewController * vc = self.view.window.rootViewController;

你可以访问这个skscene的父项,你可以在这个场景的父项中做hideBanner。 简单?

这是我做的,使其与SpriteKit场景(iPhone 6上的Xcode 6.1和iOS 8.1)工作:

第1步 – 在MyScene.h头文件中添加#import <“iAd / iAd.h”>

第2步 – 确保你声明MyScene类在MyScene.h头文件中实现协议。

步骤3-在MyScene.m文件里面添加下面的代码行 – (void)didMoveToView:(SKView *)view function。

 ADBannerView* banner=[[ADBannerView alloc]initWithFrame:CGRectZero]; CGRect bannerFrame =CGRectMake(0, 667, self.view.frame.size.width, 0); banner.frame=bannerFrame; [self.view addSubview:banner]; banner.delegate=self; 

步骤4-实施iAd的两种方法

 -(void)bannerViewDidLoadAd:(ADBannerView *)banner { CGRect bannerFrame =CGRectMake(0, 667-50, self.view.frame.size.width, 0); [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1]; banner.frame=bannerFrame; [UIView commitAnimations]; } -(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error { CGRect bannerFrame =CGRectMake(0, 667, self.view.frame.size.width, 0); [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1]; banner.frame=bannerFrame; [UIView commitAnimations]; } 

上面的代码会在有广告时将广告框移到场景中,并在没有广告的情况下通过animation来移除框架。 请注意,框架矩形中的最后一个数字是0.不pipe你放在那里,横幅高度是固定的,不会改变(50磅)。

第5步:回应此代码的广告操作:

  -(void)bannerViewActionDidFinish:(ADBannerView *)banner { [self startTimer]; } -(BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave { [gameTimer invalidate]; return YES; } 

当用户点击横幅并在用户返回游戏后恢复游戏计时器时,此代码将停止游戏计时器。 你可以在这里添加你自己的代码来保存和检索游戏数据。

希望这可以帮助。