【问题标题】:SKSceneScaleModeResizeFill on ios8 scales improperlyios8 上的 SKSceneScaleModeResizeFill 缩放不正确
【发布时间】:2016-04-25 09:25:17
【问题描述】:

我使用 Objective C 在 SpriteKit 中编写了一个游戏,它在 ios9 上完美运行,但在 ios8 上看起来很糟糕。我真的很想知道如何解决这个问题,或者通过“纠正”我的错误,或者如果我没有错误,那么通过在 ios8 中找到解决该错误的方法。

我认为我已经尽我所能将问题尽可能清晰,包括制作大量屏幕截图来说明问题,以及制作一个尽可能简单但仍能显示问题的新 Xcode 项目。

如果你想尝试 Xcode 项目,这里有一个链接……。 xcode project

如果您想查看问题的屏幕截图,那么这里是屏幕截图的链接。 Screenshots

现在我将尝试解释我编写的代码和屏幕截图中说明的问题。

请记住:我的代码在 iOS9.3 上完美运行。所以我的代码显然不是完全垃圾。但不可否认,我不是处理屏幕旋转方面的专家,所以我的代码可能会更好。

我可能应该提到两个场景都将缩放模式设置为 SKSceneScaleModeResizeFill。我之所以选择这种模式,是因为在使用 SKSceneScaleModeAspectFill 时,我很难为所有可能的屏幕尺寸(包括 iPhone)进行正确的布局。我希望我能在坚持使用 SKSceneScaleModeResizeFill 的同时解决这个问题。

无论如何,我的应用是一个有两个场景的 SpriteKit 游戏。主要场景是您玩游戏的 GameScene。而且这个场景有一个指向 SettingsScene 的指针,你可以在其中更改场景的设置。 (例如更改难度级别)。

每当用户旋转屏幕时,GameViewController 都会在 viewWillTransitionToSize 中检测到这种变化,并告诉 GameScene 对象新的屏幕宽度和屏幕高度。 Game Scene 会根据新的屏幕方向调整其 sprite 的位置,然后将新的屏幕宽度和高度告诉它的 SettingsScene 对象,以确保 Settings 场景的布局也正确。

请注意,通过这种设计,无论何时用户旋转屏幕,两个场景上的所有精灵都会重新定位,而不管当时哪个场景实际处于活动状态。..

正如我之前所说,在 ios9.3 上一切正常。但是在ios8上,结果很糟糕。屏幕截图说明了 ios8 上的一个典型体验示例。如果用户在使用游戏时旋转屏幕然后转到设置屏幕,他会看到一些可怕的东西。并且经常会陷入这种糟糕的体验,因为返回主游戏的​​按钮甚至可能不再适合屏幕了。

起初,我似乎无法在设置场景中为横向模式重新定位精灵。但这种解释是错误的。屏幕上的文字显示最后的布局是在考虑横向的情况下执行的。

那么这里出了什么问题?

任何建议都将受到高度赞赏。

谢谢!

-j

附言如果您不想直接查看链接的项目文件,这里有一些有关示例代码的详细信息。 GameViewController 实现 viewTransitionToSize 来处理任何屏幕旋转。它直接将新的屏幕尺寸告诉 GameScene,然后再告诉 SettingsScene。考虑到新的屏幕尺寸,两个场景都重新排列了它们的精灵。在ios9上一切顺利。然而,在 ios8 上,不活动的场景在呈现时最终看起来很丑陋,尽管它显然确实根据新尺寸重新定位了它的精灵。

【问题讨论】:

  • 你在模拟器上测试吗? iOS 8 模拟器中有一个 bug 有时不会触发 rotate 事件(但模拟器会旋转),请在硬件上测试以确保该 bug 不存在
  • 谢谢,但是是的。我首先注意到硬件上的问题。我的设备是装有 ios 8.4 的 iPad。无论如何,谢谢您的有趣建议。
  • 那么这个错误可能存在于框架中,而不仅仅是模拟器。在您的视图控制器中打印 didRotateFromInterfaceOrientation 函数以确保它被调用
  • 毫无疑问,它被称为。这是肯定的,因为..... (1) 两个屏幕的布局是同时更新的。不可能有一个新的横向布局而另一个没有,并且(2)丑陋的屏幕在文本中显示正确的尺寸。这证明它知道正确的尺寸并且已经考虑到它们进行了布局。
  • 您可能正在调用 UI Screen 来获取尺寸,但这并不意味着通知已触发

标签: xcode sprite-kit skscene viewwilltransitiontosize


【解决方案1】:

这些问题很容易解决....

  gameScene.size = newScreenSize;
  settingsScene.size = newScreenSize;

只要方向改变。

ios9 不需要此代码。场景在没有帮助的情况下知道屏幕的大小。但是对于ios8,似乎需要添加这段代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多