微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 动画的替代品(forKey :)(现已弃用)?

我正在使用iOS 11(适用于ARKit),虽然许多人指向Apple的SceneKit示例应用程序与Fox,我在该示例项目( file)中使用的扩展程序有问题,以添加动画:
extension CAAnimation {
    class func animationWithSceneNamed(_ name: String) -> CAAnimation? {
        var animation: CAAnimation?
        if let scene = SCNScene(named: name) {
            scene.rootNode.enumerateChildNodes({ (child,stop) in
                if child.animationKeys.count > 0 {
                    animation = child.animation(forKey: child.animationKeys.first!)
                    stop.initialize(to: true)
                }
            })
        }
        return animation
    }
}

看来这个扩展非常方便,但我不确定如何迁移它现在它已被弃用?它现在认内置在SceneKit中吗?

该文档并未真正显示有关其被弃用的原因或从何处开始的详细信息.

谢谢

解决方法

TL; DR:Apple的 sample game(搜索SCNAnimationPlayer)中可以找到如何使用新API的示例

尽管在iOS11中已经弃用了动画(forKey :)及其使用CAAnimation的姐妹方法,但您可以继续使用它们 – 一切都会起作用.

但是如果你想使用新的API并且不关心向后兼容性(无论如何你都不需要ARKit,因为它仅在iOS11之后可用),请继续阅读.

与之前的产品相比,新推出的SCNAnimationPlayer提供了更方便的API.现在可以更轻松地实时处理动画.
来自WWDC2017的This video将是了解它的一个很好的起点.

作为快速摘要:SCNAnimationPlayer允许您动态更改动画的速度.与添加删除CAAnimations相比,它使用play()和stop()等方法为动画播放提供了更直观的界面.
您还可以将两个动画混合在一起,例如,可以使用它们在它们之间进行平滑过渡.

您可以在Fox 2 game by Apple中找到如何使用所有这些的示例.

这是您发布的适用于使用SCNAnimationPlayer的扩展(您可以在Fox 2示例项目的Character类中找到它):

extension SCNAnimationPlayer {
    class func loadAnimation(fromSceneNamed sceneName: String) -> SCNAnimationPlayer {
        let scene = SCNScene( named: sceneName )!
        // find top level animation
        var animationPlayer: SCNAnimationPlayer! = nil
        scene.rootNode.enumerateChildNodes { (child,stop) in
            if !child.animationKeys.isEmpty {
                animationPlayer = child.animationPlayer(forKey: child.animationKeys[0])
                stop.pointee = true
            }
        }
        return animationPlayer
    }
}

您可以按如下方式使用它:

>加载动画并将其添加到相应的节点

let jumpAnimation = SCNAnimationPlayer.loadAnimation(fromSceneNamed: "jump.scn")
jumpAnimation.stop() // stop it for Now so that we can use it later when it's appropriate 
model.addAnimationPlayer(jumpAnimation,forKey: "jump")

>使用它!

model.animationPlayer(forKey: "jump")?.play()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐