并不可怕的Segues

Segues that aren't terrible

在我的主菜单上,我有一个简单的按钮布局和一些在背景中移动的精灵,以使其更具交互性。当我第一次 运行 它时,一切都很好,精灵移动得很顺利,如果我点击菜单的一个按钮,一个自定义的 segue 被调用,下一个视图控制器完全按照我想要的方式呈现。然后我可以按后退按钮,再次显示菜单,一切(大部分)都很好。

但是,如果我重复此过程(向导航系统发送垃圾邮件),转场仍然有效,但最终菜单页面上的精灵开始滞后并以急剧跳跃而不是平滑滑动的方式移动。所以我认为我的 segue 实现有问题

示例代码:

class SegueFromLeft: UIStoryboardSegue {
    override func perform() {
        let src = self.source
        let dst = self.destination

        if let c = src as? LSViewController {
            if let d = dst as? LSViewController {
                d.page = (c.page + c.header.count - 1) % c.header.count
            }
        }

        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
        dst.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)

        UIView.animate(withDuration: 0.25,
                   delay: 0.0,
                   options: UIViewAnimationOptions.curveEaseInOut,
                   animations: {
                    dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
        },
                   completion: { finished in
                    src.present(dst, animated: false, completion: nil) }
        )
    }
}

我处理过渡的方式有问题吗,或者问题出在其他地方(如果是,可能的原因是什么)?

更新:所以我将 SKScenes 附加到每个视图控制器。这就是我附加精灵的地方。我认为这与它有关...

在uiview动画中使用动画属性正确而不是错误。

    UIView.animate(withDuration: 0.4,
               delay: 0.0,
               options: UIViewAnimationOptions.curveEaseInOut,
               animations: {
                dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
    },
               completion: { finished in
                src.present(dst, animated: true, completion: nil) }

这里的问题是您没有在转场之前关闭 SKScenes。他们实际上只是在后台保留 运行。要解决此问题,请在 segue 期间的某处调用以下代码:

        scene.removeFromParent()
        scene.view?.presentScene(nil)

这将关闭场景并实际停止精灵。