#ios #admob #sprite-kit
#iOS #admob #sprite-kit
Вопрос:
Я пытаюсь отобразить промежуточное объявление admob после получения успешного рекламного звонка :
- (void)interstitialDidReceiveAd:(GADInterstitial *)ad {
DLog(@"interstitialDidReceiveAd");
[ad presentFromRootViewController:self];
}
self
это ViewController
экземпляр (который является контроллером корневого представления, реализованным шаблоном SpriteKit), и по какой-то причине он отображает объявление (что хорошо), но перезапускает всю сцену.
Я должен отметить, что запрос на объявление выполняется после создания и запуска сцены.
Я также заметил это поведение, когда попытался добавить представление в свойство view этого контроллера (которое является экземпляром SpriteKit SKView
)
И идеи?
Ответ №1:
Как я и думал… Я делал что-то не так…
Если вы наткнетесь на эту проблему :
Я создаю свою сцену в методе контроллера представления viewWillLayoutSubviews
(до тех пор, пока этот метод НЕ изменит границы представления на желаемую ориентацию)
При представлении промежуточной рекламы этот метод вызывается снова, и, конечно же, сцена также воссоздается. Поэтому просто добавьте логический элемент, указывающий, была ли сцена уже загружена для создания сцены только один раз.
Пуф, проблема исчезла 🙂
Комментарии:
1. пожалуйста, помогите мне. как вы решаете эту проблему, я не получил вашего ответа
2. viewWillLayoutSubviews вызывается, когда промежуточное объявление отклоняется. Поскольку я создал свою сцену этим методом, она была воссоздана снова.
Ответ №2:
Здесь происходит нечто большее, чем просто отображение промежуточной рекламы. У меня есть настройка проекта sprite kit, в котором я отображаю UIImagePickerController из RootViewController через:
#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];
}
}
Комментарии:
1. Восстановление всего состояния игры в моем случае будет непрактичным, и эта проблема, похоже, либо ошибка, либо что-то, что я делаю неправильно. Я не вижу причины, по которой нажатие другого VC должно приводить к загрузке всей сцены с нуля. Если это работает для вас, то я, вероятно, делаю что-то не так
2. Да, извините. У меня такое чувство, что вы можете захотеть проверить, что происходит на самом деле (если промежуточный элемент действительно модальный … есть методы, которые вы можете вызвать для отображаемого объекта, чтобы попытаться выяснить) и как меняются ваши состояния во время загрузки сцены. Главное, что вам нужно проверить, — это инициализируется ли ваша сцена с нуля (это ваш самый большой намек на то, что происходит). Поскольку в вашей сцене не сохраняется состояние, оно должно быть повторно инициализировано (просто проверьте это в методах инициализатора).
3. Спасибо за помощь, но я понял, как это решить. Я опубликовал ответ с решением.