我正在尝试在收到成功的广告调用后显示admob插页式广告:
- (void)interstitialDidReceiveAd:(GADInterstitial *)ad {
DLog(@"interstitialDidReceiveAd");
[ad presentFromRootViewController:self];
}
self
是ViewController
实例(由SpriteKit模板实现的根视图控制器),由于某种原因,它显示广告(这很好),但重新启动整个场景。
我应该注意广告请求是在创建和运行场景后完成的。
当我尝试将视图添加到此控制器的视图属性(这是一个SpriteKit SKView
实例)时,我也注意到了这种行为。
和想法?
答案 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];
}
}