2014-02-09 8 views
7

Ich habe versucht herauszufinden, wie iAds in meinen Spritekit-Szenen versteckt und angezeigt werden. Zur Zeit habe ich es Setup wie folgt aus:Ausblenden/Anzeigen von iAds in Spritekit

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 

Dann in meiner Szene packe ich meine Viewcontroller mit einem Zeiger:

ViewController *controller; 


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

Mein nslog läuft in der Konsole, damit ich weiß, dass es th geht Rau. Aber das Banner wird sich nicht verstecken. Irgendwelche Gedanken? Ich bin ziemlich neu mit objektiven c, also habe ich das Gefühl, ich mache nur etwas dummes.

+0

Warum verwenden 'Alpha' statt' versteckte' Eigenschaft der ADBannerView (erbt von UIView)? – Larme

+0

Aufgrund der Antwort habe ich hier gefunden: http: //stackoverflow.com/questions/20577465/is-it-allged-to-hide-iads-even-when-they-are-available Mit der ausgeblendeten Eigenschaft scheint nicht zu behebe mein Problem. – Negora

Antwort

18

Wie Huygamer sagte, erstellen Sie eine neue Instanz eines View-Controllers. Wenn Sie also Ihre Methode [controller hidesBanner]; aufrufen, beziehen Sie sich auf ein anderes Objekt.

Der beste Ansatz ist hier NSNotificationCenter zu verwenden: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

Und eine Nachricht an Ihre Viewcontroller senden, wenn Sie Ihre Anzeige ausblenden oder anzeigen wollen:

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

Und in Ihrer Szene:

[[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. 
Hier
0

Natürlich gibt es 2 Objekt und warum Sie denken, dass es tun kann?

Wenn Sie die Eltern von skscene zugreifen möchten Sie gerade dieses

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

Sie können auf die Eltern dieser Skscene zugreifen, und Sie können hideBanner am Elternteil dieser Szene tun. Einfach?

+0

Das bricht die MVC-Architektur und sollte vermieden werden. – nodebase

0

ist, was ich tat, um es mit SpriteKit Szenen (Xcode 6.1 und iOS 8.1 auf iPhone 6) funktioniert:

Schritt 1 hinzufügen #import < "iAd/iAd.h"> in MyScene.h Kopf Datei

Schritt 2- Stellen Sie sicher, dass Sie Ihre MyScene-Klasse deklarieren, Protokoll in MyScene.h-Headerdatei zu implementieren.

Schritt 3- Fügen Sie die folgenden Codezeilen in Ihrer MyScene.m-Datei ein - (Void) didMoveToView: (SKView *) View-Funktion.

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; 

Schritt 4 Implementieren Sie die beiden Methoden der 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]; 
} 

Der obige Code wird die Ad-Frame-Szene bewegen, wenn es eine Anzeige und wird den Rahmen, wenn keine Anzeige durch Animieren der Bewegung entfernen . Beachten Sie, dass die letzte Zahl im Frame-Rect 0 ist.Es spielt keine Rolle, was Sie dort setzen, die Bannerhöhe ist fest und ändert sich nicht (50 pt).

Schritt 5 Respond zu Ad Aktionen durch diesen Code:

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

    } 

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

     [gameTimer invalidate]; 

     return YES; 
     } 

Dieser Code wird das Spiel Timer stoppen, wenn ein Benutzer auf das Banner klickt und nimmt den Spiel-Timer, nachdem der Benutzer auf das Spiel kehrt zurück. Sie können hier Ihren eigenen Code zum Speichern und Abrufen von Spieldaten hinzufügen.

Hoffe, das hilft.

+0

Danke! Funktioniert bei mir. – Negora