使用SpriteKit呈现插页式广告会重新启动整个场景

时间:2014-06-28 16:58:03

标签: ios admob sprite-kit

我正在尝试在收到成功的广告调用后显示admob插页式广告:

- (void)interstitialDidReceiveAd:(GADInterstitial *)ad {
    DLog(@"interstitialDidReceiveAd");
    [ad presentFromRootViewController:self];
}

selfViewController实例(由SpriteKit模板实现的根视图控制器),由于某种原因,它显示广告(这很好),但重新启动整个场景。

我应该注意广告请求是在创建和运行场景后完成的。

当我尝试将视图添加到此控制器的视图属性(这是一个SpriteKit SKView实例)时,我也注意到了这种行为。

和想法?

2 个答案:

答案 0 :(得分:1)

正如我想的那样......我做错了什么......

如果你偶然发现了这个问题:

我在视图控制器的方法viewWillLayoutSubviews中创建我的场景(直到此方法,视图边界不会使用所需的方向更新)

当展示插页式广告时,会再次调用此方法,当然也会重新创建场景。因此,只需添加一个布尔成员,指示场景是否已加载,仅用于创建场景一次。

噗,问题已经消失了:))

答案 1 :(得分:0)

这里有一些时髦的东西,不仅仅是展示插页式广告。我有一个sprite kit项目设置,我从rootViewController通过以下方式显示UIImagePickerController:

#pragma mark - ImageCatureDelegate methods

-(void)requestImagePicker
{
    UIImagePickerController *imagePicker = [UIImagePickerController new];
    imagePicker.delegate = self;
    [self presentViewController:imagePicker animated:YES completion:nil];
}

#pragma mark - UIImagePickerControllerDelegate

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

    [picker dismissViewControllerAnimated:YES completion:^{
        SKTexture *imageTexture = [SKTexture textureWithImage:image];

        CIFilter *sepia = [CIFilter filterWithName:@"CISepiaTone"];
        [sepia setValue:@(0.8) forKey:kCIInputIntensityKey];
        imageTexture = [imageTexture textureByApplyingCIFilter:sepia];

        SKView *view = (SKView *)self.view;
        MyScene *currentScene = (MyScene *)view.scene;
        [currentScene setPhotoTexture:imageTexture];
    }];
}

在回调期间,除了解雇模态之外没有什么特别的。如果admob正在推动一个新的VC你可能会看到这个问题,但如果它以模态方式显示一个文字模态VC那么你就不应该看到这个问题了。您可能想要查看推送插页式广告时会发生什么。如果是这种情况,并且这是您可以使用的唯一方法,那么您必须使用NSCode或某些东西来保持游戏的状态,以便在插页式广告消失时将其加载回来。

编辑:

要附加到上面的解决方案,如果你使用viewWillLayoutSubviews来纠正SpriteKit中的肖像/横向问题,请务必这样做,这样只会发生一次'

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView * skView = (SKView *)self.view;

    if (!skView.scene) {
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;

        // Create and configure the scene.
        MyScene * scene = [[MyScene alloc] initWithSize:skView.bounds.size andLevelNumber:1];
        scene.scaleMode = SKSceneScaleModeAspectFill;

        // Present the scene.
        [skView presentScene:scene];
    }
}