【问题标题】:WatchOS: SDWebImageLottieCoder load new animation while watch app is runningWatchOS:SDWebImageLottieCoder 在手表应用程序运行时加载新动画
【发布时间】:2021-03-02 22:30:42
【问题描述】:

我正在关注 this tutorial 在 WatchOS 上使用 Lottie 动画库。在我尝试在应用程序运行时更改动画之前,它一直有效。即使我更改了它,动画仍然保持不变,直到我从 Xcode 运行手表应用程序。 (如果我只是关闭应用程序并再次打开它不会改变。) 我尝试了什么:

  • 从监视文件系统中清除缓存
  • 清除URLCache
  • 清除SDImageCache内存和磁盘

【问题讨论】:

    标签: swift apple-watch sdwebimage watchos lottie


    【解决方案1】:

    你是对的,缓存会导致你的问题。但是,你还不够深入。

    您使用SDWebImageLottieCoder 来显示您的动画,而动画又使用rlottie

    根据他们的自述文件: "rlottie 是一个独立于平台的独立 c++ 库,用于实时渲染基于矢量的动画和艺术。"

    关键是动画是被rlottie框架缓存的,所以不管是清除URLCache还是SDImageCache都不会解决这个问题。

    解决这个问题的最简单方法是修改rlottie C++ 库中的代码。在您的 Xcode 项目中导航到 Pods -> Pods -> librlottie 并查找以下文件:lottieanimation_capi.cpp

    在此文件中搜索以下代码:

    RLOTTIE_API Lottie_Animation_S *lottie_animation_from_data(const char *data, const char *key, const char *resourcePath)
    {
        if (auto animation = Animation::loadFromData(data, key, resourcePath) ) {
            Lottie_Animation_S *handle = new Lottie_Animation_S();
            handle->mAnimation = std::move(animation);
            return handle;
        } else {
            return nullptr;
        }
    }
    

    这是在您的设备上加载 Lottie 动画并负责缓存的代码。 loadFromData 需要额外的第四个参数cachePolicy,它是一个布尔值,在这种情况下没有为它传递任何内容。

    因此,如果您不想缓存动画,则将 false 传递给此调用。 将代码修改为此,它应该可以工作:

    RLOTTIE_API Lottie_Animation_S *lottie_animation_from_data(const char *data, const char *key, const char *resourcePath)
    {
        if (auto animation = Animation::loadFromData(data, key, resourcePath, false) ) {
            Lottie_Animation_S *handle = new Lottie_Animation_S();
            handle->mAnimation = std::move(animation);
            return handle;
        } else {
            return nullptr;
        }
    }
    

    【讨论】:

    • 谢谢,今天晚些时候我会检查并通知您
    猜你喜欢
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2011-08-06
    • 2015-04-11
    相关资源
    最近更新 更多