我在SpriteKit上遇到以下问题。我从另一个viewController呈现一个模态viewController,哪个视图是一个SKView,问题是当我关闭模态viewController时,SKView中的SKScene会冻结,如果我再次出现并解除模态视图,它会解冻。它正在切换......
奇怪的是,当场景解冻时,我可以看到动画在后台持续,因为精灵位于与冻结之前不同的位置。
为了使事情变得更奇怪,只有在实际设备中进行测试时才会发生,而不是在模拟器中进行测试。
我看到了这个问题:iAds and SpriteKit: SKScene Freeze on fullscreen exit on device only但它没有答案,问题出在使用iAd时。我已经在其他论坛中读到可以通过删除self.canDisplayBannerAds = YES
来解决,但我根本不使用iAd。
请帮忙,我绝望了。
答案 0 :(得分:4)
我有几乎相同的问题,这个链接帮助了我 Go from SKView back to UIView
重点是让你的skView成为UIView的子视图,然后创建一个链接到你的skView的IBOutlet。
使用和不使用iAd Banner的工作(在我的情况下,我将横幅设为子视图+ iboutlet)
如何重现效果:
的制备:将
动作:
如何解决问题:
使用storyboard和ViewController.h
控制 - 将skview拖动到界面并创建名为skView的IBOutlet
ViewController.h:
#import <UIKit/UIKit.h>
#import <SpriteKit/SpriteKit.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIView *skView;
@end
并用self.skView替换skView
- (void)viewDidLoad
{
[super viewDidLoad];
// Configure the view.
//SKView * skView = (SKView *)self.view;
self.skView.showsFPS = YES;
self.skView.showsNodeCount = YES;
// Create and configure the scene.
SKScene * scene = [MyScene sceneWithSize:self.skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[self.skView presentScene:scene];
}
运行,现在不再冻结
此致
答案 1 :(得分:4)
如果您仍然坚持这一点,我遇到了同样的问题,这是因为在我的SKView上添加UIButtons作为子视图。
对我来说,修复是将UIView作为视图控制器的基本视图,然后将SKView添加为子视图。您要添加的任何子视图(例如按钮)都应添加到UIView, NOT SKView。
答案 2 :(得分:0)
我遇到了同样的问题,虽然我找不到合理的理由,但我已经创建了一个解决方法。
我发现使用UIView而不是UIViewController作为模态视图似乎导致了问题。这并没有冻结skscene(看起来冻结为调用self.scene.view.paused = YES没有做任何事情并检查它是否暂停返回NO。)
我在屏幕上添加了一个uiview,然后在场景顶部将其设置为动画,然后在完成后再次关闭。然后我使用函数reloadScene来刷新我对场景所做的更改:
- (void)reloadScene {
// Configure the view.
SKView * skView = (SKView *)self.originalContentView;
// Create and configure the scene.
SKScene * scene = [FlappyBirdCloneMainMenu sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
}
然后解决了这个问题。
如果你确实发现了为什么冻结发生肯定会发布答案,因为我有兴趣知道未来的精灵套件参考。
答案 3 :(得分:0)
我有同样的问题,并且能够通过将SKView移动到UIView的子视图来修复它。
我的视图控制器中创建SKView的原始代码如下:
self.mySpriteKitView = (SKView *) self.view;
我要解决的问题就是改变它:
self.mySpriteKitView = [[SKView alloc] initWithFrame:self.view.frame];
[self.view addSubview:self.mySpriteKitView];
不幸的是,XCode的新SpriteKit项目的项目模板通过投射视图控制器的self.view创建了一个SKView,如上图所示&#34; original&#34;码。因此,除非您更改SKView创建代码,否则如果您调用模态视图(例如插页式广告),则最终会遇到此错误。