SpriteKit:当模态视图呈现时,SKScene Freeze

时间:2014-05-09 16:42:24

标签: ios objective-c sprite-kit

我在SpriteKit上遇到以下问题。我从另一个viewController呈现一个模态viewController,哪个视图是一个SKView,问题是当我关闭模态viewController时,SKView中的SKScene会冻结,如果我再次出现并解除模态视图,它会解冻。它正在切换......

奇怪的是,当场景解冻时,我可以看到动画在后台持续,因为精灵位于与冻结之前不同的位置。

为了使事情变得更奇怪,只有在实际设备中进行测试时才会发生,而不是在模拟器中进行测试。

我看到了这个问题:iAds and SpriteKit: SKScene Freeze on fullscreen exit on device only但它没有答案,问题出在使用iAd时。我已经在其他论坛中读到可以通过删除self.canDisplayBannerAds = YES来解决,但我根本不使用iAd。

请帮忙,我绝望了。

4 个答案:

答案 0 :(得分:4)

我有几乎相同的问题,这个链接帮助了我 Go from SKView back to UIView

重点是让你的skView成为UIView的子视图,然后创建一个链接到你的skView的IBOutlet。

使用和不使用iAd Banner的工作(在我的情况下,我将横幅设为子视图+ iboutlet)

如何重现效果:

的制备:将

  1. 创建一个新的SpriteKit项目
  2. 打开Main_Iphone.storyboard
  3. 添加(拖放)标签栏控制器
  4. 删除Viewcontroller Item1
  5. 从标签栏控制器到原始控件创建一个Viewcontroller Segue (Apple)viewcontroller(带skview的那个)
  6. 在“视图控制器”属性中,单击“是初始视图控制器”
  7. 在实际设备上运行
  8. 动作:

    1. 转到“项目”标签,单击以启动“平面动画”
    2. 点击第2项
    3. 点击返回项目标签=> 飞机被冻结
    4. 点击几次=>什么都没发生
    5. 点击第2项并返回Item =>几个平面移动(切换效果
    6. 如何解决问题:

      1. 将视图拖到原始(Apple)skview上您现在应该有一个 对象导航器窗格中的父/子链接(左)
      2. 置换自定义类属性,以便子节点现在为SkView,父节点为 的UIView
      3. 使用storyboard和ViewController.h

      4. 显示助理编辑器
      5. 控制 - 将skview拖动到界面并创建名为skView的IBOutlet

        ViewController.h:

        #import <UIKit/UIKit.h>
        #import <SpriteKit/SpriteKit.h>
        
        @interface ViewController : UIViewController
        @property (strong, nonatomic) IBOutlet UIView *skView;
        
        @end
        
      6. 在ViewController.m注释第19行中
      7. 并用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];
        }
        
      8. 运行,现在不再冻结

      9. 此致

答案 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创建代码,否则如果您调用模态视图(例如插页式广告),则最终会遇到此错误。