SKScene 与 UIKit 元素(UIButtons,UILabel,...)的场景转换

Posted

技术标签:

【中文标题】SKScene 与 UIKit 元素(UIButtons,UILabel,...)的场景转换【英文标题】:Scene transition of SKScene with UIKit elements (UIButtons, UILabel, ...) 【发布时间】:2014-11-30 21:12:39 【问题描述】:

我有一个 SKScene 菜单,以 SKSpriteNode 作为背景,并带有 3 个 UIButtons 和 1 个 UILabel。

当用户点击按钮时,会触发这个场景转换:

view?.presentScene(GameScene(size: view!.bounds.size), transition: SKTransition.fadeWithDuration(2))

场景确实发生了变化(背景发生了变化),但我所有的 UIElements 仍然存在。 是否有适当的方法可以在场景过渡中移除它们?通过适当的方式,我的意思是垃圾收集器应该在某个时候从内存中释放菜单场景(如果上面还有 UIElement,则无法这样做)。

【问题讨论】:

我假设您的 UIKit 元素已添加到视图中。如果您希望它们消失,您需要将它们从视图中移除。 【参考方案1】:

这里有两个选择。首先是继续使用 UIKit 元素并在过渡到游戏场景时主动移除它们。例如,您可以设置一个方法在按下游戏按钮时执行相同操作:

func hideButtons () 
    //Hide your buttons and label here.
    btn.hidden = true //Either hide it
    btn.removeFromSuperview() //or remove it altogether.
    ... 

然后在你呈现场景之前调用这个方法。

self.hideButtons()
view?.presentScene(GameScene(size: view!.bounds.size), transition: SKTransition.fadeWithDuration(2))

或者,您可以使用触摸代理在 SKScene 本身中实现一个按钮。

声明一个与您的按钮具有相同框架的 SKSpriteNode。当您检测到按钮上的触摸时,触发场景切换。

另一种选择是使用像AGSpriteButton 这样的类。它的设置系统与 UIButton 非常相似。

【讨论】:

感谢 ZeMoon。如果我隐藏按钮,就是在用户返回菜单场景时“取消隐藏”它们。如何实现“返回”过渡?我是否需要在我的每个视图文件中访问一个全局变量 menuScene(我可以从那里返回菜单)? 为此,您需要一种方法让 SKScene 与 UIViewController 进行通信。看看这个答案,看看如何达到同样的效果:***.com/a/27099631/2043580【参考方案2】:

如果您希望释放按钮,则必须将它们从视图中移除。

如果这真的有必要,值得考虑吗?回收的内存量是否值得稍后重新添加这些按钮的额外成本?假设您可以返回菜单。

有几个选项可以同时使用 SpriteKit 和 UIKit 元素制作具有视觉吸引力的过渡。虽然我不一定会推荐它们。

    通过调整frame 或alpha 手动将按钮设置为屏幕外的动画。 从 SKScene 中移除过渡,并使用 transitionWithView:duration:options:animations:completion: 或 transitionFromView:toView:duration:options:completion: 为 UIView 的过渡设置动画

如果您无法使用这些选项中的任何一个创建令人满意的效果,那么可能值得重新实现您的场景/视图以仅使用 SpriteKit 元素。

【讨论】:

如果我隐藏元素以在用户返回菜单场景时将它们显示回来,我如何真正“弹出”关卡场景以返回菜单?我必须presentScene 对吗?但这会覆盖第一个菜单场景实例? 你的 SKScene 类不应该直接负责任何 UIKit 视图,传统上这是 UIViewController 的责任,所以如果你的 MenuScene 被释放,你应该没有任何问题,然后当你返回时另一个重新分配到您的应用程序中的菜单。返回菜单后,您将告诉视图控制器再次为 UIKit 视图的显示设置动画。这是一种痛苦,也是我尽可能推荐纯 SpriteKit 方法的原因之一。将所有相关逻辑封装到单独的场景或视图控制器中也可能更好。

以上是关于SKScene 与 UIKit 元素(UIButtons,UILabel,...)的场景转换的主要内容,如果未能解决你的问题,请参考以下文章

iOS 混合 Spritekit 和 UIKit

UIKit Dynamics 碰撞 - 保持 Barriers 元素静止

touches* 事件 - SKScene 与 ViewController

OC和Swift中的UITabBar和UINaviGationBar的适配 [UITabbar在IPad中的适配]

如何将 swift 文件与 SKscene 连接?

SWIFT - 将字符串转换为 UIKit 元素