【问题标题】:SpriteKit: SKScene Freeze when modal view pesentedSpriteKit:模式视图暂停时 SKScene 冻结
【发布时间】:2014-06-27 12:07:37
【问题描述】:

我在使用 SpriteKit 时遇到以下问题。我正在从另一个视图控制器呈现一个模态视图控制器,该视图是一个 SKView,问题是当我关闭模态视图控制器时 SKView 中的 SKScene 冻结,如果我再次呈现并关闭模态视图,它就会解冻。正在切换……

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

为了让事情变得更奇怪,它只在实际设备中测试时发生,而不是在模拟器中。

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

请帮忙,我很绝望。

【问题讨论】:

  • 您是否尝试过在更改视图时暂停场景?
  • 是的,我在 viewWillDisappear 上停止更新并在 ViewWillAppear 上恢复。
  • 任何更新,因为我遇到了完全相同的问题

标签: ios objective-c sprite-kit


【解决方案1】:

如果您仍然坚持这一点,我遇到了同样的问题,这是由于在我的 SKView 上添加 UIButtons 作为子视图引起的。

对我来说,解决方法是将 UIView 作为我的视图控制器的基本视图,然后将 SKView 添加为子视图。您想要添加的任何子视图(例如按钮)都应该添加到 UIView,NOT SKView。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并且能够通过将 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,如上面我的“原始”代码所示。因此,除非您更改 SKView 创建代码,否则如果您调用模态视图(例如插页式广告),您最终会遇到此错误。

    【讨论】:

      【解决方案3】:

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

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

      无论有没有 iAd 横幅都可以工作(在我的情况下,我也将横幅设为子视图+iboutlet)

      如何重现效果:

      准备工作:

      1. 新建一个 SpriteKit 项目
      2. 打开 Main_Iphone.storyboard
      3. 添加(拖放)标签栏控制器
      4. 删除 Viewcontroller Item1
      5. 创建一个 Viewcontroller Segue 从标签栏控制器到原始 (Apple)viewcontroller(带有skview的那个)
      6. 在 View Controller 属性中单击 Is initial View Controller
      7. 在实际设备上运行

      行动:

      1. 转到项目选项卡单击以启动飞机的动画
      2. 点击第2项
      3. 点击返回物品标签 => 飞机被冻结
      4. 点击几次 => 没有任何反应
      5. 单击项目 2 并返回项目 => 几个平面移动(切换效果

      如何解决问题:

      1. 将视图拖到原始 (Apple) skview 您现在应该有一个 对象导航器窗格中的父/子链接(左)
      2. 置换自定义类属性,使子级现在是 SkView,父级是 界面视图
      3. 显示带有情节提要和 ViewController.h 的助理编辑器

      4. control-drag skview 到界面并创建一个名为 skView 的 IBOutlet

        ViewController.h:

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

      问候

      【讨论】:

        【解决方案4】:

        我遇到了完全相同的问题,虽然我没有找到原因,但我已经创建了一个解决方法。

        我发现使用 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];
        } 
        

        这样就解决了问题。

        如果您确实发现了冻结发生的原因,请务必发布答案,因为我很想知道以供将来的 sprite kit 参考。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-12
          • 1970-01-01
          相关资源
          最近更新 更多