2014-02-09 68 views
7

我一直在試圖弄清楚如何在我的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 *controller; 


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

我的nslog在控制檯中運行,所以我知道它正在進行粗。但橫幅不會隱藏。有什麼想法嗎?我非常新的目標C,所以我有一種感覺,我只是在做一些愚蠢的事情。

+0

爲什麼使用'alpha'而不是ADBannerView的'hidden'屬性(繼承自UIView)? – Larme

+0

因爲答案我在這裏找到:http://stackoverflow.com/questions/20577465/is-it-allowed-to-hide-iads-even-when-they-are-available使用隱藏的屬性不會出現解決我的問題。 – Negora

回答

18

就像Huygamer說的那樣,您正在創建一個視圖控制器的新實例,因此當您調用方法[controller hidesBanner];時,您指的是另一個對象。

這裏最好的解決方法是使用NSNotificationCenterhttps://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. 
0

當然,有2個對象,爲什麼你認爲它可以做?

如果您要訪問skscene的父母只是這樣做

的UIViewController * VC = self.view.window.rootViewController;

您可以訪問此skscene的父級,並且您可以在此場景的父級上執行hideBanner。簡單?

+0

這打破了MVC架構,應該避免。 – nodebase

0

這裏是我做的,使其與SpriteKit工作場景(的Xcode 6.1和iOS 8.1的iPhone 6):

第1步 - 添加#進口< 「IAD/iAd.h」>在MyScene.h頭文件

第2步確保您聲明您的MyScene類在MyScene.h頭文件中實現協議。

步驟3-在MyScene.m文件中添加以下代碼行 - (void)didMoveToView:(SKView *)view函數。

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]; 
} 

上述代碼時,有一個廣告,並且將刪除框架將移動廣告幀到場景如果沒有廣告由動畫運動。請注意,幀矩形中的最後一個數字是0。無論你放在那裏,旗幟的高度是固定的,不會改變(50點)。

步驟5-應對反傾銷行動的這段代碼:

-(void)bannerViewActionDidFinish:(ADBannerView *)banner 
    { 
    [self startTimer]; 

    } 

    -(BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave 
    { 

     [gameTimer invalidate]; 

     return YES; 
     } 

當用戶點擊該橫幅和用戶返回到比賽結束後恢復比賽計時器這個代碼將停止比賽計時器。您可以在這裏添加您自己的代碼以保存和檢索遊戲數據。

希望這會有所幫助。

+0

謝謝!適用於我。 – Negora