├── .gitignore ├── .travis.yml ├── Example ├── JFDynamicLottie.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── JFDynamicLottie-Example.xcscheme ├── JFDynamicLottie.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── JFDynamicLottie │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── snap.imageset │ │ │ ├── Contents.json │ │ │ └── snap.png │ ├── Info.plist │ ├── Resource │ │ ├── cube_normal_lottie │ │ │ ├── data.json │ │ │ └── images │ │ │ │ ├── img_0.png │ │ │ │ ├── img_1.png │ │ │ │ ├── img_10.png │ │ │ │ ├── img_11.png │ │ │ │ ├── img_12.png │ │ │ │ ├── img_13.png │ │ │ │ ├── img_14.png │ │ │ │ ├── img_15.png │ │ │ │ ├── img_16.png │ │ │ │ ├── img_17.png │ │ │ │ ├── img_18.png │ │ │ │ ├── img_19.png │ │ │ │ ├── img_2.png │ │ │ │ ├── img_20.png │ │ │ │ ├── img_21.png │ │ │ │ ├── img_22.png │ │ │ │ ├── img_23.png │ │ │ │ ├── img_24.png │ │ │ │ ├── img_25.png │ │ │ │ ├── img_26.png │ │ │ │ ├── img_27.png │ │ │ │ ├── img_28.png │ │ │ │ ├── img_29.png │ │ │ │ ├── img_3.png │ │ │ │ ├── img_30.png │ │ │ │ ├── img_31.png │ │ │ │ ├── img_32.png │ │ │ │ ├── img_33.png │ │ │ │ ├── img_34.png │ │ │ │ ├── img_35.png │ │ │ │ ├── img_36.png │ │ │ │ ├── img_37.png │ │ │ │ ├── img_38.png │ │ │ │ ├── img_39.png │ │ │ │ ├── img_4.png │ │ │ │ ├── img_40.png │ │ │ │ ├── img_41.png │ │ │ │ ├── img_42.png │ │ │ │ ├── img_43.png │ │ │ │ ├── img_44.png │ │ │ │ ├── img_45.png │ │ │ │ ├── img_46.png │ │ │ │ ├── img_47.png │ │ │ │ ├── img_48.png │ │ │ │ ├── img_49.png │ │ │ │ ├── img_5.png │ │ │ │ ├── img_50.png │ │ │ │ ├── img_51.png │ │ │ │ ├── img_52.png │ │ │ │ ├── img_53.png │ │ │ │ ├── img_54.png │ │ │ │ ├── img_55.png │ │ │ │ ├── img_56.png │ │ │ │ ├── img_57.png │ │ │ │ ├── img_58.png │ │ │ │ ├── img_59.png │ │ │ │ ├── img_6.png │ │ │ │ ├── img_60.png │ │ │ │ ├── img_61.png │ │ │ │ ├── img_62.png │ │ │ │ ├── img_63.png │ │ │ │ ├── img_64.png │ │ │ │ ├── img_65.png │ │ │ │ ├── img_66.png │ │ │ │ ├── img_67.png │ │ │ │ ├── img_68.png │ │ │ │ ├── img_69.png │ │ │ │ ├── img_7.png │ │ │ │ ├── img_70.png │ │ │ │ ├── img_71.png │ │ │ │ ├── img_72.png │ │ │ │ ├── img_73.png │ │ │ │ ├── img_74.png │ │ │ │ ├── img_75.png │ │ │ │ ├── img_76.png │ │ │ │ ├── img_77.png │ │ │ │ ├── img_78.png │ │ │ │ ├── img_79.png │ │ │ │ ├── img_8.png │ │ │ │ ├── img_80.png │ │ │ │ ├── img_81.png │ │ │ │ ├── img_82.png │ │ │ │ ├── img_83.png │ │ │ │ ├── img_84.png │ │ │ │ ├── img_85.png │ │ │ │ ├── img_86.png │ │ │ │ ├── img_87.png │ │ │ │ ├── img_88.png │ │ │ │ ├── img_89.png │ │ │ │ ├── img_9.png │ │ │ │ ├── img_90.png │ │ │ │ ├── img_91.png │ │ │ │ ├── img_92.png │ │ │ │ ├── img_93.jpg │ │ │ │ ├── img_94.png │ │ │ │ └── img_95.png │ │ ├── pk_progressbar_lottie │ │ │ ├── data.json │ │ │ └── images │ │ │ │ ├── img_0.png │ │ │ │ ├── img_1.png │ │ │ │ ├── img_2.png │ │ │ │ ├── img_3.png │ │ │ │ ├── img_4.png │ │ │ │ ├── img_5.png │ │ │ │ ├── img_6.png │ │ │ │ └── img_7.png │ │ ├── pk_start │ │ │ ├── data.json │ │ │ └── images │ │ │ │ ├── img_0.png │ │ │ │ ├── img_10.png │ │ │ │ ├── img_11.png │ │ │ │ ├── img_12.png │ │ │ │ ├── img_13.png │ │ │ │ ├── img_14.png │ │ │ │ ├── img_15.png │ │ │ │ ├── img_16.png │ │ │ │ ├── img_17.png │ │ │ │ ├── img_6.png │ │ │ │ ├── img_7.png │ │ │ │ ├── img_8.png │ │ │ │ └── img_9.png │ │ └── slog_zm_effect_1 │ │ │ ├── data.json │ │ │ └── images │ │ │ ├── img_0.png │ │ │ └── img_1.png │ ├── ViewController.swift │ └── data.json ├── Podfile ├── Podfile.lock ├── Pods │ ├── JFPopup │ │ ├── LICENSE │ │ ├── README.md │ │ └── Sources │ │ │ └── JFPopup │ │ │ ├── Classes │ │ │ ├── Core │ │ │ │ ├── JFPopup.swift │ │ │ │ ├── JFPopupAnimation.swift │ │ │ │ ├── JFPopupController.swift │ │ │ │ ├── JFPopupView.swift │ │ │ │ ├── UIView+JFPopup.swift │ │ │ │ └── UIViewContoller+JFPopup.swift │ │ │ └── General │ │ │ │ ├── ActionSheet │ │ │ │ ├── JFPopupAction.swift │ │ │ │ └── JFPopupActionSheetView.swift │ │ │ │ ├── Alert │ │ │ │ ├── JFAlertAction.swift │ │ │ │ ├── JFAlertView+PopupView.swift │ │ │ │ ├── JFAlertView+UIViewController.swift │ │ │ │ └── JFAlertView.swift │ │ │ │ └── Toast │ │ │ │ ├── JFToastQueueTask.swift │ │ │ │ ├── JFToastView+Objc.swift │ │ │ │ └── JFToastView.swift │ │ │ └── Resources │ │ │ ├── fail@2x.png │ │ │ ├── jf_loading@2x.png │ │ │ └── success@2x.png │ ├── JRBaseKit │ │ ├── LICENSE │ │ └── Sources │ │ │ ├── JF.swift │ │ │ ├── Size+Extenison.swift │ │ │ ├── UIColor+Extension.swift │ │ │ ├── UIImage+JFColor.swift │ │ │ ├── UIView+JFRect.swift │ │ │ └── UIView+JFSnapShot.swift │ ├── Local Podspecs │ │ └── JFDynamicLottie.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ ├── Target Support Files │ │ ├── JFDynamicLottie │ │ │ ├── JFDynamicLottie-Info.plist │ │ │ ├── JFDynamicLottie-dummy.m │ │ │ ├── JFDynamicLottie-prefix.pch │ │ │ ├── JFDynamicLottie-umbrella.h │ │ │ ├── JFDynamicLottie.debug.xcconfig │ │ │ ├── JFDynamicLottie.modulemap │ │ │ └── JFDynamicLottie.release.xcconfig │ │ ├── JFPopup │ │ │ ├── JFPopup-Info.plist │ │ │ ├── JFPopup-dummy.m │ │ │ ├── JFPopup-prefix.pch │ │ │ ├── JFPopup-umbrella.h │ │ │ ├── JFPopup.debug.xcconfig │ │ │ ├── JFPopup.modulemap │ │ │ ├── JFPopup.release.xcconfig │ │ │ └── ResourceBundle-JFPopup-JFPopup-Info.plist │ │ ├── JRBaseKit │ │ │ ├── JRBaseKit-Info.plist │ │ │ ├── JRBaseKit-dummy.m │ │ │ ├── JRBaseKit-prefix.pch │ │ │ ├── JRBaseKit-umbrella.h │ │ │ ├── JRBaseKit.debug.xcconfig │ │ │ ├── JRBaseKit.modulemap │ │ │ └── JRBaseKit.release.xcconfig │ │ ├── Pods-JFDynamicLottie_Example │ │ │ ├── Pods-JFDynamicLottie_Example-Info.plist │ │ │ ├── Pods-JFDynamicLottie_Example-acknowledgements.markdown │ │ │ ├── Pods-JFDynamicLottie_Example-acknowledgements.plist │ │ │ ├── Pods-JFDynamicLottie_Example-dummy.m │ │ │ ├── Pods-JFDynamicLottie_Example-frameworks.sh │ │ │ ├── Pods-JFDynamicLottie_Example-umbrella.h │ │ │ ├── Pods-JFDynamicLottie_Example.debug.xcconfig │ │ │ ├── Pods-JFDynamicLottie_Example.modulemap │ │ │ └── Pods-JFDynamicLottie_Example.release.xcconfig │ │ ├── Pods-JFDynamicLottie_Tests │ │ │ ├── Pods-JFDynamicLottie_Tests-Info.plist │ │ │ ├── Pods-JFDynamicLottie_Tests-acknowledgements.markdown │ │ │ ├── Pods-JFDynamicLottie_Tests-acknowledgements.plist │ │ │ ├── Pods-JFDynamicLottie_Tests-dummy.m │ │ │ ├── Pods-JFDynamicLottie_Tests-umbrella.h │ │ │ ├── Pods-JFDynamicLottie_Tests.debug.xcconfig │ │ │ ├── Pods-JFDynamicLottie_Tests.modulemap │ │ │ └── Pods-JFDynamicLottie_Tests.release.xcconfig │ │ ├── Zip │ │ │ ├── Zip-Info.plist │ │ │ ├── Zip-dummy.m │ │ │ ├── Zip-prefix.pch │ │ │ ├── Zip-umbrella.h │ │ │ ├── Zip.debug.xcconfig │ │ │ ├── Zip.modulemap │ │ │ └── Zip.release.xcconfig │ │ └── lottie-ios │ │ │ ├── lottie-ios-Info.plist │ │ │ ├── lottie-ios-dummy.m │ │ │ ├── lottie-ios-prefix.pch │ │ │ ├── lottie-ios-umbrella.h │ │ │ ├── lottie-ios.debug.xcconfig │ │ │ ├── lottie-ios.modulemap │ │ │ └── lottie-ios.release.xcconfig │ ├── Zip │ │ ├── LICENSE │ │ ├── README.md │ │ └── Zip │ │ │ ├── QuickZip.swift │ │ │ ├── Zip.h │ │ │ ├── Zip.swift │ │ │ ├── ZipUtilities.swift │ │ │ └── minizip │ │ │ ├── include │ │ │ ├── Minizip.h │ │ │ ├── crypt.h │ │ │ ├── ioapi.h │ │ │ ├── unzip.h │ │ │ └── zip.h │ │ │ ├── ioapi.c │ │ │ ├── module │ │ │ └── module.modulemap │ │ │ ├── unzip.c │ │ │ └── zip.c │ └── lottie-ios │ │ ├── LICENSE │ │ ├── README.md │ │ └── Sources │ │ ├── Private │ │ ├── CoreAnimation │ │ │ ├── Animations │ │ │ │ ├── CAAnimation+TimingConfiguration.swift │ │ │ │ ├── CALayer+addAnimation.swift │ │ │ │ ├── CombinedShapeAnimation.swift │ │ │ │ ├── CustomPathAnimation.swift │ │ │ │ ├── DropShadowAnimation.swift │ │ │ │ ├── EllipseAnimation.swift │ │ │ │ ├── GradientAnimations.swift │ │ │ │ ├── LayerProperty.swift │ │ │ │ ├── OpacityAnimation.swift │ │ │ │ ├── RectangleAnimation.swift │ │ │ │ ├── ShapeAnimation.swift │ │ │ │ ├── StarAnimation.swift │ │ │ │ ├── StrokeAnimation.swift │ │ │ │ ├── TransformAnimations.swift │ │ │ │ └── VisibilityAnimation.swift │ │ │ ├── CompatibilityTracker.swift │ │ │ ├── CoreAnimationLayer.swift │ │ │ ├── Extensions │ │ │ │ ├── CALayer+fillBounds.swift │ │ │ │ ├── KeyframeGroup+exactlyOneKeyframe.swift │ │ │ │ └── Keyframes+combined.swift │ │ │ ├── Layers │ │ │ │ ├── AnimationLayer.swift │ │ │ │ ├── BaseAnimationLayer.swift │ │ │ │ ├── BaseCompositionLayer.swift │ │ │ │ ├── CALayer+setupLayerHierarchy.swift │ │ │ │ ├── GradientRenderLayer.swift │ │ │ │ ├── ImageLayer.swift │ │ │ │ ├── InfiniteOpaqueAnimationLayer.swift │ │ │ │ ├── LayerModel+makeAnimationLayer.swift │ │ │ │ ├── MaskCompositionLayer.swift │ │ │ │ ├── PreCompLayer.swift │ │ │ │ ├── RepeaterLayer.swift │ │ │ │ ├── ShapeItemLayer.swift │ │ │ │ ├── ShapeLayer.swift │ │ │ │ ├── SolidLayer.swift │ │ │ │ ├── TextLayer.swift │ │ │ │ └── TransformLayer.swift │ │ │ └── ValueProviderStore.swift │ │ ├── EmbeddedLibraries │ │ │ ├── EpoxyCore │ │ │ │ ├── Diffing │ │ │ │ │ ├── Collection+Diff.swift │ │ │ │ │ ├── Diffable.swift │ │ │ │ │ ├── DiffableSection.swift │ │ │ │ │ ├── IndexChangeset.swift │ │ │ │ │ └── SectionedChangeset.swift │ │ │ │ ├── Logging │ │ │ │ │ └── EpoxyLogger.swift │ │ │ │ ├── Model │ │ │ │ │ ├── CallbackContextEpoxyModeled.swift │ │ │ │ │ ├── EpoxyModelArrayBuilder.swift │ │ │ │ │ ├── EpoxyModelProperty.swift │ │ │ │ │ ├── EpoxyModelStorage.swift │ │ │ │ │ ├── EpoxyModeled.swift │ │ │ │ │ ├── Internal │ │ │ │ │ │ ├── AnyEpoxyModelProperty.swift │ │ │ │ │ │ └── ClassReference.swift │ │ │ │ │ ├── Providers │ │ │ │ │ │ ├── AnimatedProviding.swift │ │ │ │ │ │ ├── DataIDProviding.swift │ │ │ │ │ │ ├── DidDisplayProviding.swift │ │ │ │ │ │ ├── DidEndDisplayingProviding.swift │ │ │ │ │ │ ├── DidSelectProviding.swift │ │ │ │ │ │ ├── ErasedContentProviding.swift │ │ │ │ │ │ ├── MakeViewProviding.swift │ │ │ │ │ │ ├── SetBehaviorsProviding.swift │ │ │ │ │ │ ├── SetContentProviding.swift │ │ │ │ │ │ ├── StyleIDProviding.swift │ │ │ │ │ │ ├── TraitCollectionProviding.swift │ │ │ │ │ │ ├── ViewDifferentiatorProviding.swift │ │ │ │ │ │ ├── ViewProviding.swift │ │ │ │ │ │ └── WillDisplayProviding.swift │ │ │ │ │ └── ViewEpoxyModeled.swift │ │ │ │ ├── SwiftUI │ │ │ │ │ ├── EpoxySwiftUIHostingController.swift │ │ │ │ │ ├── EpoxySwiftUIHostingView.swift │ │ │ │ │ ├── EpoxySwiftUIIntrinsicContentSizeInvalidator.swift │ │ │ │ │ ├── EpoxySwiftUILayoutMargins.swift │ │ │ │ │ ├── EpoxyableView+SwiftUIView.swift │ │ │ │ │ ├── LayoutUtilities │ │ │ │ │ │ ├── MeasuringViewRepresentable.swift │ │ │ │ │ │ └── SwiftUIMeasurementContainer.swift │ │ │ │ │ ├── SwiftUIView.swift │ │ │ │ │ ├── UIView+SwiftUIView.swift │ │ │ │ │ └── UIViewConfiguringSwiftUIView.swift │ │ │ │ └── Views │ │ │ │ │ ├── BehaviorsConfigurableView.swift │ │ │ │ │ ├── ContentConfigurableView.swift │ │ │ │ │ ├── EpoxyableView.swift │ │ │ │ │ ├── StyledView.swift │ │ │ │ │ └── ViewType.swift │ │ │ └── ZipFoundation │ │ │ │ ├── Archive+BackingConfiguration.swift │ │ │ │ ├── Archive+Helpers.swift │ │ │ │ ├── Archive+MemoryFile.swift │ │ │ │ ├── Archive+Progress.swift │ │ │ │ ├── Archive+Reading.swift │ │ │ │ ├── Archive+ReadingDeprecated.swift │ │ │ │ ├── Archive+Writing.swift │ │ │ │ ├── Archive+WritingDeprecated.swift │ │ │ │ ├── Archive+ZIP64.swift │ │ │ │ ├── Archive.swift │ │ │ │ ├── Data+Compression.swift │ │ │ │ ├── Data+CompressionDeprecated.swift │ │ │ │ ├── Data+Serialization.swift │ │ │ │ ├── Entry+Serialization.swift │ │ │ │ ├── Entry+ZIP64.swift │ │ │ │ ├── Entry.swift │ │ │ │ ├── FileManager+ZIP.swift │ │ │ │ └── URL+ZIP.swift │ │ ├── MainThread │ │ │ ├── LayerContainers │ │ │ │ ├── CompLayers │ │ │ │ │ ├── CompositionLayer.swift │ │ │ │ │ ├── ImageCompositionLayer.swift │ │ │ │ │ ├── MaskContainerLayer.swift │ │ │ │ │ ├── NullCompositionLayer.swift │ │ │ │ │ ├── PreCompositionLayer.swift │ │ │ │ │ ├── ShapeCompositionLayer.swift │ │ │ │ │ ├── SolidCompositionLayer.swift │ │ │ │ │ └── TextCompositionLayer.swift │ │ │ │ ├── MainThreadAnimationLayer.swift │ │ │ │ └── Utility │ │ │ │ │ ├── CachedImageProvider.swift │ │ │ │ │ ├── CompositionLayersInitializer.swift │ │ │ │ │ ├── CoreTextRenderLayer.swift │ │ │ │ │ ├── InvertedMatteLayer.swift │ │ │ │ │ ├── LayerFontProvider.swift │ │ │ │ │ ├── LayerImageProvider.swift │ │ │ │ │ ├── LayerTextProvider.swift │ │ │ │ │ └── LayerTransformNode.swift │ │ │ └── NodeRenderSystem │ │ │ │ ├── Extensions │ │ │ │ └── ItemsExtension.swift │ │ │ │ ├── NodeProperties │ │ │ │ ├── NodeProperty.swift │ │ │ │ ├── Protocols │ │ │ │ │ ├── AnyNodeProperty.swift │ │ │ │ │ ├── AnyValueContainer.swift │ │ │ │ │ ├── KeypathSearchable.swift │ │ │ │ │ └── NodePropertyMap.swift │ │ │ │ ├── ValueContainer.swift │ │ │ │ └── ValueProviders │ │ │ │ │ ├── GroupInterpolator.swift │ │ │ │ │ └── SingleValueProvider.swift │ │ │ │ ├── Nodes │ │ │ │ ├── ModifierNodes │ │ │ │ │ ├── RoundedCornersNode.swift │ │ │ │ │ └── TrimPathNode.swift │ │ │ │ ├── OutputNodes │ │ │ │ │ ├── GroupOutputNode.swift │ │ │ │ │ ├── PassThroughOutputNode.swift │ │ │ │ │ ├── PathOutputNode.swift │ │ │ │ │ └── Renderables │ │ │ │ │ │ ├── FillRenderer.swift │ │ │ │ │ │ ├── GradientFillRenderer.swift │ │ │ │ │ │ ├── GradientStrokeRenderer.swift │ │ │ │ │ │ ├── LegacyGradientFillRenderer.swift │ │ │ │ │ │ └── StrokeRenderer.swift │ │ │ │ ├── PathNodes │ │ │ │ │ ├── EllipseNode.swift │ │ │ │ │ ├── PolygonNode.swift │ │ │ │ │ ├── RectNode.swift │ │ │ │ │ ├── ShapeNode.swift │ │ │ │ │ └── StarNode.swift │ │ │ │ ├── RenderContainers │ │ │ │ │ └── GroupNode.swift │ │ │ │ ├── RenderNodes │ │ │ │ │ ├── FillNode.swift │ │ │ │ │ ├── GradientFillNode.swift │ │ │ │ │ ├── GradientStrokeNode.swift │ │ │ │ │ └── StrokeNode.swift │ │ │ │ └── Text │ │ │ │ │ └── TextAnimatorNode.swift │ │ │ │ ├── Protocols │ │ │ │ ├── AnimatorNode.swift │ │ │ │ ├── PathNode.swift │ │ │ │ └── RenderNode.swift │ │ │ │ └── RenderLayers │ │ │ │ ├── ShapeContainerLayer.swift │ │ │ │ └── ShapeRenderLayer.swift │ │ ├── Model │ │ │ ├── Assets │ │ │ │ ├── Asset.swift │ │ │ │ ├── AssetLibrary.swift │ │ │ │ ├── ImageAsset.swift │ │ │ │ └── PrecompAsset.swift │ │ │ ├── DictionaryInitializable.swift │ │ │ ├── DotLottie │ │ │ │ ├── DotLottieAnimation.swift │ │ │ │ ├── DotLottieImageProvider.swift │ │ │ │ ├── DotLottieManifest.swift │ │ │ │ └── DotLottieUtils.swift │ │ │ ├── Extensions │ │ │ │ ├── Bundle.swift │ │ │ │ └── KeyedDecodingContainerExtensions.swift │ │ │ ├── Keyframes │ │ │ │ ├── KeyframeData.swift │ │ │ │ └── KeyframeGroup.swift │ │ │ ├── LayerEffects │ │ │ │ ├── DropShadowEffect.swift │ │ │ │ ├── EffectValues │ │ │ │ │ ├── ColorEffectValue.swift │ │ │ │ │ ├── EffectValue.swift │ │ │ │ │ └── Vector1DEffectValue.swift │ │ │ │ └── LayerEffect.swift │ │ │ ├── LayerStyles │ │ │ │ ├── DropShadowStyle.swift │ │ │ │ └── LayerStyle.swift │ │ │ ├── Layers │ │ │ │ ├── ImageLayerModel.swift │ │ │ │ ├── LayerModel.swift │ │ │ │ ├── PreCompLayerModel.swift │ │ │ │ ├── ShapeLayerModel.swift │ │ │ │ ├── SolidLayerModel.swift │ │ │ │ └── TextLayerModel.swift │ │ │ ├── Objects │ │ │ │ ├── DashPattern.swift │ │ │ │ ├── Marker.swift │ │ │ │ ├── Mask.swift │ │ │ │ └── Transform.swift │ │ │ ├── ShapeItems │ │ │ │ ├── Ellipse.swift │ │ │ │ ├── Fill.swift │ │ │ │ ├── GradientFill.swift │ │ │ │ ├── GradientStroke.swift │ │ │ │ ├── Group.swift │ │ │ │ ├── Merge.swift │ │ │ │ ├── Rectangle.swift │ │ │ │ ├── Repeater.swift │ │ │ │ ├── RoundedCorners.swift │ │ │ │ ├── Shape.swift │ │ │ │ ├── ShapeItem.swift │ │ │ │ ├── ShapeTransform.swift │ │ │ │ ├── Star.swift │ │ │ │ ├── Stroke.swift │ │ │ │ └── Trim.swift │ │ │ └── Text │ │ │ │ ├── Font.swift │ │ │ │ ├── Glyph.swift │ │ │ │ ├── TextAnimator.swift │ │ │ │ └── TextDocument.swift │ │ ├── RootAnimationLayer.swift │ │ └── Utility │ │ │ ├── Debugging │ │ │ ├── AnimatorNodeDebugging.swift │ │ │ ├── LayerDebugging.swift │ │ │ └── TestHelpers.swift │ │ │ ├── Extensions │ │ │ ├── AnimationKeypathExtension.swift │ │ │ ├── BlendMode+Filter.swift │ │ │ ├── CGColor+RGB.swift │ │ │ ├── CGFloatExtensions.swift │ │ │ ├── DataExtension.swift │ │ │ ├── MathKit.swift │ │ │ └── StringExtensions.swift │ │ │ ├── Helpers │ │ │ ├── AnimationContext.swift │ │ │ ├── AnyEquatable.swift │ │ │ ├── Binding+Map.swift │ │ │ └── View+ValueChanged.swift │ │ │ ├── Interpolatable │ │ │ ├── InterpolatableExtensions.swift │ │ │ ├── KeyframeExtensions.swift │ │ │ └── KeyframeInterpolator.swift │ │ │ ├── LottieAnimationSource.swift │ │ │ └── Primitives │ │ │ ├── BezierPath.swift │ │ │ ├── BezierPathRoundExtension.swift │ │ │ ├── CGPointExtension.swift │ │ │ ├── ColorExtension.swift │ │ │ ├── CompoundBezierPath.swift │ │ │ ├── CurveVertex.swift │ │ │ ├── PathElement.swift │ │ │ ├── UnitBezier.swift │ │ │ └── VectorsExtensions.swift │ │ └── Public │ │ ├── Animation │ │ ├── LottieAnimation.swift │ │ ├── LottieAnimationHelpers.swift │ │ ├── LottieAnimationLayer.swift │ │ ├── LottieAnimationView.swift │ │ ├── LottieAnimationViewInitializers.swift │ │ ├── LottiePlaybackMode.swift │ │ └── LottieView.swift │ │ ├── AnimationCache │ │ ├── AnimationCacheProvider.swift │ │ ├── DefaultAnimationCache.swift │ │ ├── LRUAnimationCache.swift │ │ └── LottieAnimationCache.swift │ │ ├── Configuration │ │ ├── DecodingStrategy.swift │ │ ├── LottieConfiguration.swift │ │ ├── ReducedMotionOption.swift │ │ └── RenderingEngineOption.swift │ │ ├── Controls │ │ ├── AnimatedButton.swift │ │ ├── AnimatedControl.swift │ │ ├── AnimatedSwitch.swift │ │ ├── LottieButton.swift │ │ ├── LottieSwitch.swift │ │ └── LottieViewType.swift │ │ ├── DotLottie │ │ ├── Cache │ │ │ ├── DotLottieCache.swift │ │ │ └── DotLottieCacheProvider.swift │ │ ├── DotLottieConfiguration.swift │ │ ├── DotLottieFile.swift │ │ └── DotLottieFileHelpers.swift │ │ ├── DynamicProperties │ │ ├── AnimationKeypath.swift │ │ ├── AnyValueProvider.swift │ │ └── ValueProviders │ │ │ ├── ColorValueProvider.swift │ │ │ ├── FloatValueProvider.swift │ │ │ ├── GradientValueProvider.swift │ │ │ ├── PointValueProvider.swift │ │ │ └── SizeValueProvider.swift │ │ ├── FontProvider │ │ └── AnimationFontProvider.swift │ │ ├── ImageProvider │ │ └── AnimationImageProvider.swift │ │ ├── Keyframes │ │ ├── Interpolatable.swift │ │ └── Keyframe.swift │ │ ├── Logging │ │ └── LottieLogger.swift │ │ ├── Primitives │ │ ├── AnimationTime.swift │ │ ├── LottieColor.swift │ │ └── Vectors.swift │ │ ├── TextProvider │ │ └── AnimationTextProvider.swift │ │ └── iOS │ │ ├── AnimationSubview.swift │ │ ├── BundleImageProvider.swift │ │ ├── Compatibility │ │ ├── CompatibleAnimationKeypath.swift │ │ └── CompatibleAnimationView.swift │ │ ├── FilepathImageProvider.swift │ │ ├── LottieAnimationViewBase.swift │ │ └── UIColorExtension.swift └── Tests │ ├── Info.plist │ └── Tests.swift ├── JFDynamicLottie.podspec ├── JFDynamicLottie ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── JFLottieAnimationHelper.swift │ ├── JFLottieAnimationView.swift │ ├── JFLottieImageProvider.swift │ └── JFLottieTextProvider.swift ├── LICENSE ├── README.md └── _Pods.xcodeproj /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | *.moved-aside 17 | DerivedData 18 | *.hmap 19 | *.ipa 20 | 21 | # Bundler 22 | .bundle 23 | 24 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 25 | # Carthage/Checkouts 26 | 27 | Carthage/Build 28 | 29 | # We recommend against adding the Pods directory to your .gitignore. However 30 | # you should judge for yourself, the pros and cons are mentioned at: 31 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 32 | # 33 | # Note: if you ignore the Pods directory, make sure to uncomment 34 | # `pod install` in .travis.yml 35 | # 36 | # Pods/ 37 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * https://www.objc.io/issues/6-build-tools/travis-ci/ 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/JFDynamicLottie.xcworkspace -scheme JFDynamicLottie-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /Example/JFDynamicLottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/JFDynamicLottie.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/JFDynamicLottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Images.xcassets/snap.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "snap.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Images.xcassets/snap.imageset/snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Images.xcassets/snap.imageset/snap.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSAppTransportSecurity 6 | 7 | NSAllowsArbitraryLoads 8 | 9 | 10 | CFBundleDevelopmentRegion 11 | en 12 | CFBundleExecutable 13 | $(EXECUTABLE_NAME) 14 | CFBundleIdentifier 15 | $(PRODUCT_BUNDLE_IDENTIFIER) 16 | CFBundleInfoDictionaryVersion 17 | 6.0 18 | CFBundleName 19 | $(PRODUCT_NAME) 20 | CFBundlePackageType 21 | APPL 22 | CFBundleShortVersionString 23 | 1.0 24 | CFBundleSignature 25 | ???? 26 | CFBundleVersion 27 | 1 28 | LSRequiresIPhoneOS 29 | 30 | UILaunchStoryboardName 31 | LaunchScreen 32 | UIMainStoryboardFile 33 | Main 34 | UIRequiredDeviceCapabilities 35 | 36 | armv7 37 | 38 | UISupportedInterfaceOrientations 39 | 40 | UIInterfaceOrientationPortrait 41 | UIInterfaceOrientationLandscapeLeft 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_0.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_1.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_10.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_11.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_12.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_13.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_14.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_15.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_16.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_17.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_18.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_19.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_2.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_20.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_21.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_22.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_23.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_24.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_25.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_26.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_27.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_28.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_29.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_3.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_30.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_31.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_32.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_33.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_34.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_35.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_36.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_37.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_38.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_39.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_4.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_40.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_41.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_42.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_43.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_44.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_45.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_46.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_47.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_48.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_49.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_5.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_50.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_51.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_52.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_53.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_54.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_55.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_56.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_57.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_58.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_59.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_6.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_60.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_61.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_62.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_63.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_64.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_65.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_66.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_67.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_68.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_69.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_7.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_70.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_71.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_71.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_72.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_73.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_74.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_75.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_76.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_77.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_78.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_78.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_79.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_79.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_8.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_80.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_81.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_82.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_83.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_84.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_85.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_86.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_87.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_88.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_89.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_9.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_90.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_91.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_92.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_93.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_93.jpg -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_94.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/cube_normal_lottie/images/img_95.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_0.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_1.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_2.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_3.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_4.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_5.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_6.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_progressbar_lottie/images/img_7.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_0.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_10.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_11.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_12.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_13.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_14.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_15.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_16.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_17.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_6.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_7.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_8.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/pk_start/images/img_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/pk_start/images/img_9.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/slog_zm_effect_1/images/img_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/slog_zm_effect_1/images/img_0.png -------------------------------------------------------------------------------- /Example/JFDynamicLottie/Resource/slog_zm_effect_1/images/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/JFDynamicLottie/Resource/slog_zm_effect_1/images/img_1.png -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | platform :ios, '11.0' 4 | 5 | target 'JFDynamicLottie_Example' do 6 | pod 'JFDynamicLottie', :path => '../' 7 | pod 'JFPopup' 8 | 9 | post_install do |installer| 10 | installer.generated_projects.each do |project| 11 | project.targets.each do |target| 12 | target.build_configurations.each do |config| 13 | config.build_settings['CODE_SIGN_IDENTITY'] = '' 14 | config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' 15 | end 16 | end 17 | end 18 | end 19 | 20 | target 'JFDynamicLottie_Tests' do 21 | inherit! :search_paths 22 | 23 | 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - JFDynamicLottie (1.1.0): 3 | - lottie-ios (~> 4.3.0) 4 | - Zip (~> 2.1) 5 | - JFPopup (1.5.4): 6 | - JRBaseKit (~> 1.1.1) 7 | - JRBaseKit (1.1.2) 8 | - lottie-ios (4.3.3) 9 | - Zip (2.1.2) 10 | 11 | DEPENDENCIES: 12 | - JFDynamicLottie (from `../`) 13 | - JFPopup 14 | 15 | SPEC REPOS: 16 | trunk: 17 | - JFPopup 18 | - JRBaseKit 19 | - lottie-ios 20 | - Zip 21 | 22 | EXTERNAL SOURCES: 23 | JFDynamicLottie: 24 | :path: "../" 25 | 26 | SPEC CHECKSUMS: 27 | JFDynamicLottie: e0a227300e627e39f7e54dd482f2853b3d470053 28 | JFPopup: c3ada13bbda3cfe85bd71228e20a0b622eab72af 29 | JRBaseKit: 825cca458a73990f6019deaaaaff75840dea477f 30 | lottie-ios: 25e7b2675dad5c3ddad369ac9baab03560c5bfdd 31 | Zip: b3fef584b147b6e582b2256a9815c897d60ddc67 32 | 33 | PODFILE CHECKSUM: f5922071f54d9e27131d4b71a65a3af73b7a5dfc 34 | 35 | COCOAPODS: 1.11.3 36 | -------------------------------------------------------------------------------- /Example/Pods/JFPopup/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2021 JerryFans 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/Pods/JFPopup/Sources/JFPopup/Classes/General/ActionSheet/JFPopupAction.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JFPopupAction.swift 3 | // JFPopup 4 | // 5 | // Created by 逸风 on 2021/10/9. 6 | // 7 | 8 | import UIKit 9 | 10 | @objc public class JFPopupAction: NSObject { 11 | 12 | var title: String? 13 | var subTitle: String? 14 | var subAttributedTitle: NSAttributedString? 15 | var clickActionCallBack: (() -> ())? 16 | var autoDismiss: Bool = true //auto dismiss when you click action 17 | 18 | @objc public convenience init(with title: String?, subTitle: String?, autoDismiss: Bool = true, clickActionCallBack: @escaping (() -> ())) { 19 | self.init() 20 | self.title = title 21 | self.subTitle = subTitle 22 | self.autoDismiss = autoDismiss 23 | self.clickActionCallBack = clickActionCallBack 24 | } 25 | 26 | @objc public convenience init(with title: String?, subAttributedTitle: NSAttributedString?, autoDismiss: Bool = true, clickActionCallBack: @escaping (() -> ())) { 27 | self.init() 28 | self.title = title 29 | self.subAttributedTitle = subAttributedTitle 30 | self.autoDismiss = autoDismiss 31 | self.clickActionCallBack = clickActionCallBack 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /Example/Pods/JFPopup/Sources/JFPopup/Classes/General/Toast/JFToastQueueTask.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JFToastQueueTask.swift 3 | // JFPopup 4 | // 5 | // Created by 逸风 on 2021/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class JFToastQueueTask: NSObject { 11 | 12 | var config: JFPopupConfig? 13 | var toastConfig: JFToastConfig? 14 | weak var mainContainer: UIView? 15 | weak var popupView: JFPopupView? 16 | 17 | override init() { 18 | super.init() 19 | } 20 | 21 | convenience init(with config: JFPopupConfig, toastConfig: JFToastConfig?, mainContainer: UIView?, popupView: JFPopupView?) { 22 | self.init() 23 | self.config = config 24 | self.toastConfig = toastConfig 25 | self.mainContainer = mainContainer 26 | self.popupView = popupView 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Example/Pods/JFPopup/Sources/JFPopup/Classes/General/Toast/JFToastView+Objc.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JFToastView+Objc.swift 3 | // JFPopup 4 | // 5 | // Created by 逸风 on 2021/10/19. 6 | // 7 | 8 | import UIKit 9 | 10 | @objc public enum JFToastObjcAssetType: Int { 11 | case unknow 12 | case success 13 | case fail 14 | case imageName 15 | } 16 | 17 | public extension JFToastView { 18 | 19 | @objc class func toast(hit: String) { 20 | JFToastView.toast(hit: hit, type: .unknow, imageName: nil) 21 | } 22 | 23 | @objc class func toast(icon: JFToastObjcAssetType, imageName: String?) { 24 | JFToastView.toast(hit: nil, type: icon, imageName: imageName) 25 | } 26 | 27 | @objc class func toast(hit: String?, type: JFToastObjcAssetType, imageName: String?) { 28 | var options: [JFToastOption] = [] 29 | if let hit = hit { 30 | options += [.hit(hit)] 31 | } 32 | if type != .unknow { 33 | var iconType: JFToastAssetIconType? 34 | if type == .success { 35 | iconType = .success 36 | } else if type == .fail { 37 | iconType = .fail 38 | } else if let name = imageName, type == .imageName { 39 | iconType = .imageName(name: name, imageType: "png") 40 | } 41 | if let icon = iconType { 42 | options += [.icon(icon)] 43 | } 44 | } 45 | JFPopupView.popup.toast { 46 | options 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Example/Pods/JFPopup/Sources/JFPopup/Resources/fail@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/Pods/JFPopup/Sources/JFPopup/Resources/fail@2x.png -------------------------------------------------------------------------------- /Example/Pods/JFPopup/Sources/JFPopup/Resources/jf_loading@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/Pods/JFPopup/Sources/JFPopup/Resources/jf_loading@2x.png -------------------------------------------------------------------------------- /Example/Pods/JFPopup/Sources/JFPopup/Resources/success@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/Example/Pods/JFPopup/Sources/JFPopup/Resources/success@2x.png -------------------------------------------------------------------------------- /Example/Pods/JRBaseKit/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2021 JerryFans 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/Pods/JRBaseKit/Sources/JF.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JF.swift 3 | // Example 4 | // 5 | // Created by JerryFans on 2021/8/4. 6 | // 7 | import UIKit 8 | public struct JF { 9 | let base: Base 10 | init(_ base: Base) { 11 | self.base = base 12 | } 13 | } 14 | 15 | public protocol JFCompatible {} 16 | public extension JFCompatible { 17 | static var jf: JF.Type { 18 | set {} 19 | get { JF.self } 20 | } 21 | var jf: JF { 22 | set {} 23 | get { JF(self) } 24 | } 25 | } 26 | 27 | 28 | -------------------------------------------------------------------------------- /Example/Pods/JRBaseKit/Sources/UIColor+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extension.swift 3 | // Example 4 | // 5 | // Created by JerryFans on 2021/8/4. 6 | // 7 | 8 | import UIKit 9 | extension UIColor: JFCompatible {} 10 | public extension JF where Base: UIColor { 11 | //0xRRGGBB 12 | static func rgb(_ hex:UInt32, alpha:CGFloat = 1.0) -> UIColor { 13 | let divisor = CGFloat(255) 14 | let red = CGFloat((hex & 0xFF0000) >> 16) / divisor 15 | let green = CGFloat((hex & 0x00FF00) >> 8) / divisor 16 | let blue = CGFloat( hex & 0x0000FF ) / divisor 17 | return UIColor.init(red: red, green: green, blue: blue, alpha: alpha) 18 | } 19 | 20 | //0xRRGGBBAA 21 | static func rgba(_ hex:UInt32) -> UIColor { 22 | let divisor = CGFloat(255) 23 | let red = CGFloat((hex & 0xFF000000) >> 24) / divisor 24 | let green = CGFloat((hex & 0x00FF0000) >> 16) / divisor 25 | let blue = CGFloat((hex & 0x0000FF00) >> 8) / divisor 26 | let alpha = CGFloat( hex & 0x000000FF ) / divisor 27 | return UIColor.init(red: red, green: green, blue: blue, alpha: alpha == 0 ? 1 : alpha) 28 | } 29 | 30 | static func argb(_ hex:UInt32) -> UIColor { 31 | let divisor = CGFloat(255) 32 | let alpha = CGFloat((hex & 0xFF000000) >> 24) / divisor 33 | let red = CGFloat((hex & 0x00FF0000) >> 16) / divisor 34 | let green = CGFloat((hex & 0x0000FF00) >> 8) / divisor 35 | let blue = CGFloat( hex & 0x000000FF ) / divisor 36 | return UIColor.init(red: red, green: green, blue: blue, alpha: alpha == 0 ? 1 : alpha) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/Pods/JRBaseKit/Sources/UIImage+JFColor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+JFColor.swift 3 | // JRBaseKit 4 | // 5 | // Created by 逸风 on 2021/10/10. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIImage: JFCompatible {} 11 | public extension JF where Base: UIImage { 12 | static func color(_ hex:UInt32, alpha:CGFloat = 1.0) -> UIImage { 13 | return UIImage(customColor: UIColor.jf.rgb(hex, alpha: alpha)) 14 | } 15 | } 16 | 17 | public extension UIImage { 18 | @objc convenience init(customColor: UIColor,size: CGSize = CGSize(width: 1, height: 1)) { 19 | let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height) 20 | UIGraphicsBeginImageContext(rect.size) 21 | let context = UIGraphicsGetCurrentContext(); 22 | context?.setFillColor(customColor.cgColor); 23 | context?.fill(rect) 24 | let image = UIGraphicsGetImageFromCurrentImageContext() 25 | UIGraphicsEndImageContext() 26 | guard let cgImage = image?.cgImage else { 27 | self.init() 28 | return 29 | } 30 | self.init(cgImage: cgImage) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Example/Pods/JRBaseKit/Sources/UIView+JFSnapShot.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+JFSnapShot.swift 3 | // JRBaseKit 4 | // 5 | // Created by JerryFans on 2023/10/8. 6 | // 7 | 8 | import UIKit 9 | 10 | public extension UIView { 11 | @objc func jf_syncSnapshotImage() -> UIImage? { 12 | return self.jf.syncSnapshotImage() 13 | } 14 | 15 | @objc func jf_syncSnapshotImage(scale:CGFloat) -> UIImage? { 16 | return self.jf.syncSnapshotImage(scale: scale) 17 | } 18 | } 19 | 20 | public extension JF where Base: UIView { 21 | 22 | func removeAllSubviews() { 23 | while (base.subviews.count != 0) { 24 | base.subviews.last?.removeFromSuperview() 25 | } 26 | } 27 | 28 | func syncSnapshotImage() -> UIImage? { 29 | return base.jf.syncSnapshotImage(scale: UIScreen.main.scale) 30 | } 31 | 32 | func syncSnapshotImage(scale:CGFloat) -> UIImage? { 33 | if base.bounds.size == .zero { 34 | return nil 35 | } 36 | UIGraphicsBeginImageContextWithOptions(base.bounds.size, false, scale); 37 | let snapshotImage:UIImage? = { 38 | guard let currentContext = UIGraphicsGetCurrentContext() else { 39 | return nil 40 | } 41 | base.layer.render(in: currentContext) 42 | return UIGraphicsGetImageFromCurrentImageContext() 43 | }() 44 | UIGraphicsEndImageContext() 45 | return snapshotImage 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/JFDynamicLottie.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "JFDynamicLottie", 3 | "version": "1.1.0", 4 | "summary": "JFDynamicLottie is a Lottie Extension which can dynamic replace Lottie resource like image、text and with high performance running Lottie animation.", 5 | "description": "TODO: Add long description of the pod here.", 6 | "homepage": "https://github.com/JerryFans/JFDynamicLottie", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "JerryFans": "fanjiarong_haohao@163.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/JerryFans/JFDynamicLottie.git", 16 | "tag": "1.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "11.0" 20 | }, 21 | "swift_versions": "5.0", 22 | "source_files": "JFDynamicLottie/Classes/**/*", 23 | "dependencies": { 24 | "lottie-ios": [ 25 | "~> 4.3.0" 26 | ], 27 | "Zip": [ 28 | "~> 2.1" 29 | ] 30 | }, 31 | "swift_version": "5.0" 32 | } 33 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - JFDynamicLottie (1.1.0): 3 | - lottie-ios (~> 4.3.0) 4 | - Zip (~> 2.1) 5 | - JFPopup (1.5.4): 6 | - JRBaseKit (~> 1.1.1) 7 | - JRBaseKit (1.1.2) 8 | - lottie-ios (4.3.3) 9 | - Zip (2.1.2) 10 | 11 | DEPENDENCIES: 12 | - JFDynamicLottie (from `../`) 13 | - JFPopup 14 | 15 | SPEC REPOS: 16 | trunk: 17 | - JFPopup 18 | - JRBaseKit 19 | - lottie-ios 20 | - Zip 21 | 22 | EXTERNAL SOURCES: 23 | JFDynamicLottie: 24 | :path: "../" 25 | 26 | SPEC CHECKSUMS: 27 | JFDynamicLottie: e0a227300e627e39f7e54dd482f2853b3d470053 28 | JFPopup: c3ada13bbda3cfe85bd71228e20a0b622eab72af 29 | JRBaseKit: 825cca458a73990f6019deaaaaff75840dea477f 30 | lottie-ios: 25e7b2675dad5c3ddad369ac9baab03560c5bfdd 31 | Zip: b3fef584b147b6e582b2256a9815c897d60ddc67 32 | 33 | PODFILE CHECKSUM: f5922071f54d9e27131d4b71a65a3af73b7a5dfc 34 | 35 | COCOAPODS: 1.11.3 36 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFDynamicLottie/JFDynamicLottie-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFDynamicLottie/JFDynamicLottie-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_JFDynamicLottie : NSObject 3 | @end 4 | @implementation PodsDummy_JFDynamicLottie 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFDynamicLottie/JFDynamicLottie-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFDynamicLottie/JFDynamicLottie-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double JFDynamicLottieVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char JFDynamicLottieVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFDynamicLottie/JFDynamicLottie.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JFDynamicLottie 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Zip" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 6 | OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "Lottie" -framework "QuartzCore" -framework "UIKit" -framework "Zip" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFDynamicLottie/JFDynamicLottie.modulemap: -------------------------------------------------------------------------------- 1 | framework module JFDynamicLottie { 2 | umbrella header "JFDynamicLottie-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFDynamicLottie/JFDynamicLottie.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JFDynamicLottie 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Zip" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 6 | OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "Lottie" -framework "QuartzCore" -framework "UIKit" -framework "Zip" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFPopup/JFPopup-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.5.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFPopup/JFPopup-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_JFPopup : NSObject 3 | @end 4 | @implementation PodsDummy_JFPopup 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFPopup/JFPopup-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFPopup/JFPopup-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double JFPopupVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char JFPopupVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFPopup/JFPopup.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JFPopup 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 6 | OTHER_LDFLAGS = $(inherited) -framework "JRBaseKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/JFPopup 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFPopup/JFPopup.modulemap: -------------------------------------------------------------------------------- 1 | framework module JFPopup { 2 | umbrella header "JFPopup-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFPopup/JFPopup.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JFPopup 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 6 | OTHER_LDFLAGS = $(inherited) -framework "JRBaseKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_ROOT = ${SRCROOT} 11 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/JFPopup 12 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 13 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 14 | SKIP_INSTALL = YES 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JFPopup/ResourceBundle-JFPopup-JFPopup-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleIdentifier 8 | ${PRODUCT_BUNDLE_IDENTIFIER} 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundleName 12 | ${PRODUCT_NAME} 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.5.4 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JRBaseKit/JRBaseKit-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.1.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JRBaseKit/JRBaseKit-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_JRBaseKit : NSObject 3 | @end 4 | @implementation PodsDummy_JRBaseKit 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JRBaseKit/JRBaseKit-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JRBaseKit/JRBaseKit-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double JRBaseKitVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char JRBaseKitVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JRBaseKit/JRBaseKit.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/JRBaseKit 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 12 | SKIP_INSTALL = YES 13 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 14 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JRBaseKit/JRBaseKit.modulemap: -------------------------------------------------------------------------------- 1 | framework module JRBaseKit { 2 | umbrella header "JRBaseKit-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/JRBaseKit/JRBaseKit.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/JRBaseKit 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 12 | SKIP_INSTALL = YES 13 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 14 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Example/Pods-JFDynamicLottie_Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Example/Pods-JFDynamicLottie_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_JFDynamicLottie_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_JFDynamicLottie_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Example/Pods-JFDynamicLottie_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_JFDynamicLottie_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_JFDynamicLottie_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Example/Pods-JFDynamicLottie_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JFDynamicLottie" "${PODS_CONFIGURATION_BUILD_DIR}/JFPopup" "${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit" "${PODS_CONFIGURATION_BUILD_DIR}/Zip" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JFDynamicLottie/JFDynamicLottie.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JFPopup/JFPopup.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit/JRBaseKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Zip/Zip.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 8 | OTHER_LDFLAGS = $(inherited) -l"z" -framework "CoreGraphics" -framework "JFDynamicLottie" -framework "JFPopup" -framework "JRBaseKit" -framework "Lottie" -framework "QuartzCore" -framework "UIKit" -framework "Zip" 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 10 | PODS_BUILD_DIR = ${BUILD_DIR} 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 13 | PODS_ROOT = ${SRCROOT}/Pods 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Example/Pods-JFDynamicLottie_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_JFDynamicLottie_Example { 2 | umbrella header "Pods-JFDynamicLottie_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Example/Pods-JFDynamicLottie_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JFDynamicLottie" "${PODS_CONFIGURATION_BUILD_DIR}/JFPopup" "${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit" "${PODS_CONFIGURATION_BUILD_DIR}/Zip" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JFDynamicLottie/JFDynamicLottie.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JFPopup/JFPopup.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit/JRBaseKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Zip/Zip.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 8 | OTHER_LDFLAGS = $(inherited) -l"z" -framework "CoreGraphics" -framework "JFDynamicLottie" -framework "JFPopup" -framework "JRBaseKit" -framework "Lottie" -framework "QuartzCore" -framework "UIKit" -framework "Zip" 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 10 | PODS_BUILD_DIR = ${BUILD_DIR} 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 13 | PODS_ROOT = ${SRCROOT}/Pods 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Tests/Pods-JFDynamicLottie_Tests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Tests/Pods-JFDynamicLottie_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Tests/Pods-JFDynamicLottie_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Tests/Pods-JFDynamicLottie_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_JFDynamicLottie_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_JFDynamicLottie_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Tests/Pods-JFDynamicLottie_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_JFDynamicLottie_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_JFDynamicLottie_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Tests/Pods-JFDynamicLottie_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JFDynamicLottie" "${PODS_CONFIGURATION_BUILD_DIR}/JFPopup" "${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit" "${PODS_CONFIGURATION_BUILD_DIR}/Zip" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JFDynamicLottie/JFDynamicLottie.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JFPopup/JFPopup.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit/JRBaseKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Zip/Zip.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -l"z" -framework "CoreGraphics" -framework "JFDynamicLottie" -framework "JFPopup" -framework "JRBaseKit" -framework "Lottie" -framework "QuartzCore" -framework "UIKit" -framework "Zip" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Tests/Pods-JFDynamicLottie_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_JFDynamicLottie_Tests { 2 | umbrella header "Pods-JFDynamicLottie_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-JFDynamicLottie_Tests/Pods-JFDynamicLottie_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JFDynamicLottie" "${PODS_CONFIGURATION_BUILD_DIR}/JFPopup" "${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit" "${PODS_CONFIGURATION_BUILD_DIR}/Zip" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JFDynamicLottie/JFDynamicLottie.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JFPopup/JFPopup.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JRBaseKit/JRBaseKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Zip/Zip.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/Lottie.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -l"z" -framework "CoreGraphics" -framework "JFDynamicLottie" -framework "JFPopup" -framework "JRBaseKit" -framework "Lottie" -framework "QuartzCore" -framework "UIKit" -framework "Zip" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Zip/Zip-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.1.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Zip/Zip-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Zip : NSObject 3 | @end 4 | @implementation PodsDummy_Zip 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Zip/Zip-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Zip/Zip-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "Zip.h" 14 | 15 | FOUNDATION_EXPORT double ZipVersionNumber; 16 | FOUNDATION_EXPORT const unsigned char ZipVersionString[]; 17 | 18 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Zip/Zip.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Zip 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SRCROOT)/Zip/Zip/ 5 | OTHER_LDFLAGS = $(inherited) -l"z" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Zip 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 13 | SKIP_INSTALL = YES 14 | SWIFT_INCLUDE_PATHS = $(inherited) $(SRCROOT)/Zip/Zip/minizip/** 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Zip/Zip.modulemap: -------------------------------------------------------------------------------- 1 | framework module Zip { 2 | umbrella header "Zip-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Zip/Zip.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Zip 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SRCROOT)/Zip/Zip/ 5 | OTHER_LDFLAGS = $(inherited) -l"z" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Zip 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 13 | SKIP_INSTALL = YES 14 | SWIFT_INCLUDE_PATHS = $(inherited) $(SRCROOT)/Zip/Zip/minizip/** 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 16 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/lottie-ios/lottie-ios-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 4.3.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/lottie-ios/lottie-ios-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_lottie_ios : NSObject 3 | @end 4 | @implementation PodsDummy_lottie_ios 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/lottie-ios/lottie-ios-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/lottie-ios/lottie-ios-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double LottieVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char LottieVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/lottie-ios/lottie-ios.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "QuartzCore" -framework "UIKit" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/lottie-ios 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 13 | SKIP_INSTALL = YES 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/lottie-ios/lottie-ios.modulemap: -------------------------------------------------------------------------------- 1 | framework module Lottie { 2 | umbrella header "lottie-ios-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/lottie-ios/lottie-ios.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift 5 | OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "QuartzCore" -framework "UIKit" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_ROOT = ${SRCROOT} 10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/lottie-ios 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 13 | SKIP_INSTALL = YES 14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 15 | -------------------------------------------------------------------------------- /Example/Pods/Zip/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Roy Marmelstein 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Example/Pods/Zip/Zip/Zip.h: -------------------------------------------------------------------------------- 1 | // 2 | // Zip.h 3 | // Zip 4 | // 5 | // Created by Roy Marmelstein on 13/12/2015. 6 | // Copyright © 2015 Roy Marmelstein. All rights reserved. 7 | // 8 | 9 | @import Foundation; 10 | 11 | //! Project version number for Zip. 12 | FOUNDATION_EXPORT double ZipVersionNumber; 13 | 14 | //! Project version string for Zip. 15 | FOUNDATION_EXPORT const unsigned char ZipVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Example/Pods/Zip/Zip/minizip/include/Minizip.h: -------------------------------------------------------------------------------- 1 | // 2 | // Minizip.h 3 | // Zip 4 | // 5 | // Created by Florian Friedrich on 3/27/19. 6 | // Copyright © 2019 Roy Marmelstein. All rights reserved. 7 | // 8 | 9 | #ifndef Minizip_h 10 | #define Minizip_h 11 | 12 | #import "crypt.h" 13 | #import "unzip.h" 14 | #import "zip.h" 15 | 16 | #endif /* Minizip_h */ 17 | -------------------------------------------------------------------------------- /Example/Pods/Zip/Zip/minizip/module/module.modulemap: -------------------------------------------------------------------------------- 1 | module Minizip [system][extern_c] { 2 | header "../include/Minizip.h" 3 | link "z" 4 | export * 5 | } 6 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 12/21/21. 2 | // Copyright © 2021 Airbnb Inc. All rights reserved. 3 | 4 | import QuartzCore 5 | 6 | extension CAShapeLayer { 7 | /// Adds animations for the given `Ellipse` to this `CALayer` 8 | @nonobjc 9 | func addAnimations( 10 | for ellipse: Ellipse, 11 | context: LayerAnimationContext, 12 | pathMultiplier: PathMultiplier) 13 | throws 14 | { 15 | try addAnimation( 16 | for: .path, 17 | keyframes: ellipse.combinedKeyframes(), 18 | value: { keyframe in 19 | BezierPath.ellipse( 20 | size: keyframe.size.sizeValue, 21 | center: keyframe.position.pointValue, 22 | direction: ellipse.direction) 23 | .cgPath() 24 | .duplicated(times: pathMultiplier) 25 | }, 26 | context: context) 27 | } 28 | } 29 | 30 | extension Ellipse { 31 | /// Data that represents how to render an ellipse at a specific point in time 32 | struct Keyframe { 33 | let size: LottieVector3D 34 | let position: LottieVector3D 35 | } 36 | 37 | /// Creates a single array of animatable keyframes from the separate arrays of keyframes in this Ellipse 38 | func combinedKeyframes() throws -> KeyframeGroup { 39 | Keyframes.combined( 40 | size, position, 41 | makeCombinedResult: Ellipse.Keyframe.init) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 12/21/21. 2 | // Copyright © 2021 Airbnb Inc. All rights reserved. 3 | 4 | import QuartzCore 5 | 6 | extension CALayer { 7 | /// Adds an animation for the given `inTime` and `outTime` to this `CALayer` 8 | @nonobjc 9 | func addVisibilityAnimation( 10 | inFrame: AnimationFrameTime, 11 | outFrame: AnimationFrameTime, 12 | context: LayerAnimationContext) 13 | { 14 | let animation = CAKeyframeAnimation(keyPath: #keyPath(isHidden)) 15 | animation.calculationMode = .discrete 16 | 17 | animation.values = [ 18 | true, // hidden, before `inFrame` 19 | false, // visible 20 | true, // hidden, after `outFrame` 21 | ] 22 | 23 | // From the documentation of `keyTimes`: 24 | // - If the calculationMode is set to discrete, the first value in the array 25 | // must be 0.0 and the last value must be 1.0. The array should have one more 26 | // entry than appears in the values array. For example, if there are two values, 27 | // there should be three key times. 28 | animation.keyTimes = [ 29 | NSNumber(value: 0.0), 30 | NSNumber(value: max(Double(context.progressTime(for: inFrame)), 0)), 31 | NSNumber(value: min(Double(context.progressTime(for: outFrame)), 1)), 32 | NSNumber(value: 1.0), 33 | ] 34 | 35 | add(animation, timedWith: context) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 12/15/21. 2 | // Copyright © 2021 Airbnb Inc. All rights reserved. 3 | 4 | import QuartzCore 5 | 6 | // MARK: - CALayer + fillBoundsOfSuperlayer 7 | 8 | extension CALayer { 9 | /// Updates the `bounds` of this layer to fill the bounds of its `superlayer` 10 | /// without setting `frame` (which is not permitted if the layer can rotate) 11 | @nonobjc 12 | func fillBoundsOfSuperlayer() { 13 | guard let superlayer = superlayer else { return } 14 | 15 | if let customLayerLayer = self as? CustomLayoutLayer { 16 | customLayerLayer.layout(superlayerBounds: superlayer.bounds) 17 | } 18 | 19 | else { 20 | // By default the `anchorPoint` of a layer is `CGPoint(x: 0.5, y: 0.5)`. 21 | // Setting it to `.zero` makes the layer have the same coordinate space 22 | // as its superlayer, which lets use use `superlayer.bounds` directly. 23 | anchorPoint = .zero 24 | 25 | bounds = superlayer.bounds 26 | } 27 | } 28 | } 29 | 30 | // MARK: - CustomLayoutLayer 31 | 32 | /// A `CALayer` that sets a custom `bounds` and `anchorPoint` relative to its superlayer 33 | protocol CustomLayoutLayer: CALayer { 34 | func layout(superlayerBounds: CGRect) 35 | } 36 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 1/11/22. 2 | // Copyright © 2022 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - KeyframeGroup + exactlyOneKeyframe 5 | 6 | extension KeyframeGroup { 7 | /// Retrieves the first `Keyframe` from this group, 8 | /// and asserts that there are not any extra keyframes that would be ignored 9 | /// - This should only be used in cases where it's fundamentally not possible to 10 | /// support animating a given property (e.g. if Core Animation itself doesn't 11 | /// support the property). 12 | func exactlyOneKeyframe( 13 | context: CompatibilityTrackerProviding, 14 | description: String, 15 | fileID _: StaticString = #fileID, 16 | line _: UInt = #line) 17 | throws 18 | -> T 19 | { 20 | try context.compatibilityAssert( 21 | keyframes.count == 1, 22 | """ 23 | The Core Animation rendering engine does not support animating multiple keyframes 24 | for \(description) values, due to limitations of Core Animation. 25 | """) 26 | 27 | return keyframes[0].value 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 1/27/22. 2 | // Copyright © 2022 Airbnb Inc. All rights reserved. 3 | 4 | import QuartzCore 5 | 6 | /// A base `CALayer` that manages the frame and animations 7 | /// of its `sublayers` and `mask` 8 | class BaseAnimationLayer: CALayer, AnimationLayer { 9 | 10 | // MARK: Internal 11 | 12 | override func layoutSublayers() { 13 | super.layoutSublayers() 14 | 15 | for sublayer in managedSublayers { 16 | sublayer.fillBoundsOfSuperlayer() 17 | } 18 | } 19 | 20 | func setupAnimations(context: LayerAnimationContext) throws { 21 | for childAnimationLayer in managedSublayers { 22 | try (childAnimationLayer as? AnimationLayer)?.setupAnimations(context: context) 23 | } 24 | } 25 | 26 | // MARK: Private 27 | 28 | /// All of the sublayers managed by this container 29 | private var managedSublayers: [CALayer] { 30 | (sublayers ?? []) + [mask].compactMap { $0 } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/CoreAnimation/Layers/TransformLayer.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 12/21/21. 2 | // Copyright © 2021 Airbnb Inc. All rights reserved. 3 | 4 | /// The CALayer type responsible for only rendering the `transform` of a `LayerModel` 5 | final class TransformLayer: BaseCompositionLayer { 6 | 7 | /// `TransformLayer`s don't render any visible content, 8 | /// they just `transform` their sublayers 9 | override var renderLayerContents: Bool { false } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Diffing/Diffable.swift: -------------------------------------------------------------------------------- 1 | // Created by Laura Skelton on 5/11/17. 2 | // Copyright © 2017 Airbnb. All rights reserved. 3 | 4 | // MARK: - Diffable 5 | 6 | /// A protocol that allows us to check identity and equality between items for the purposes of 7 | /// diffing. 8 | protocol Diffable { 9 | 10 | /// Checks for equality between items when diffing. 11 | /// 12 | /// - Parameters: 13 | /// - otherDiffableItem: The other item to check equality against while diffing. 14 | func isDiffableItemEqual(to otherDiffableItem: Diffable) -> Bool 15 | 16 | /// The identifier to use when checking identity while diffing. 17 | var diffIdentifier: AnyHashable { get } 18 | } 19 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Diffing/DiffableSection.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/9/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - DiffableSection 5 | 6 | /// A protocol that allows us to check identity and equality between sections of `Diffable` items 7 | /// for the purposes of diffing. 8 | protocol DiffableSection: Diffable { 9 | /// The diffable items in this section. 10 | associatedtype DiffableItems: Collection where 11 | DiffableItems.Index == Int, 12 | DiffableItems.Element: Diffable 13 | 14 | /// The diffable items in this section. 15 | var diffableItems: DiffableItems { get } 16 | } 17 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Diffing/SectionedChangeset.swift: -------------------------------------------------------------------------------- 1 | // Created by Laura Skelton on 5/11/17. 2 | // Copyright © 2017 Airbnb. All rights reserved. 3 | 4 | /// A set of the minimum changes to get from one array of `DiffableSection`s to another, used for 5 | /// diffing. 6 | struct SectionedChangeset { 7 | 8 | // MARK: Lifecycle 9 | 10 | init( 11 | sectionChangeset: IndexSetChangeset, 12 | itemChangeset: IndexPathChangeset) 13 | { 14 | self.sectionChangeset = sectionChangeset 15 | self.itemChangeset = itemChangeset 16 | } 17 | 18 | // MARK: Internal 19 | 20 | /// A set of the minimum changes to get from one set of sections to another. 21 | var sectionChangeset: IndexSetChangeset 22 | 23 | /// A set of the minimum changes to get from one set of items to another, aggregated across all 24 | /// sections. 25 | var itemChangeset: IndexPathChangeset 26 | 27 | /// Whether there are any inserts, deletes, moves, or updates in this changeset. 28 | var isEmpty: Bool { 29 | sectionChangeset.isEmpty && itemChangeset.isEmpty 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/CallbackContextEpoxyModeled.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/15/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | /// An Epoxy model with an associated context type that's passed into callback closures. 5 | protocol CallbackContextEpoxyModeled: EpoxyModeled { 6 | /// A context type that's passed into callback closures. 7 | associatedtype CallbackContext 8 | } 9 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/EpoxyModelArrayBuilder.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 3/15/21. 2 | // Copyright © 2021 Airbnb Inc. All rights reserved. 3 | 4 | /// A generic result builder that enables a DSL for building arrays of Epoxy models. 5 | @resultBuilder 6 | enum EpoxyModelArrayBuilder { 7 | typealias Expression = Model 8 | typealias Component = [Model] 9 | 10 | static func buildExpression(_ expression: Expression) -> Component { 11 | [expression] 12 | } 13 | 14 | static func buildExpression(_ expression: Component) -> Component { 15 | expression 16 | } 17 | 18 | static func buildExpression(_ expression: Expression?) -> Component { 19 | if let expression = expression { 20 | return [expression] 21 | } 22 | return [] 23 | } 24 | 25 | static func buildBlock(_ children: Component...) -> Component { 26 | children.flatMap { $0 } 27 | } 28 | 29 | static func buildBlock(_ component: Component) -> Component { 30 | component 31 | } 32 | 33 | static func buildOptional(_ children: Component?) -> Component { 34 | children ?? [] 35 | } 36 | 37 | static func buildEither(first child: Component) -> Component { 38 | child 39 | } 40 | 41 | static func buildEither(second child: Component) -> Component { 42 | child 43 | } 44 | 45 | static func buildArray(_ components: [Component]) -> Component { 46 | components.flatMap { $0 } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Internal/AnyEpoxyModelProperty.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/1/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - AnyEpoxyModelProperty 5 | 6 | /// An erased `EpoxyModelProperty`, with the ability to call the `UpdateStrategy` even when the type 7 | /// has been erased. 8 | protocol AnyEpoxyModelProperty { 9 | /// Returns the updated property from updating from given old to new property. 10 | func update(old: Any, new: Any) -> Any 11 | } 12 | 13 | // MARK: - EpoxyModelProperty + AnyEpoxyModelProperty 14 | 15 | extension EpoxyModelProperty: AnyEpoxyModelProperty { 16 | func update(old: Any, new: Any) -> Any { 17 | guard let typedOld = old as? Value else { 18 | EpoxyLogger.shared.assertionFailure( 19 | "Expected old to be of type \(Value.self), instead found \(old). This is programmer error.") 20 | return defaultValue() 21 | } 22 | guard let typedNew = new as? Value else { 23 | EpoxyLogger.shared.assertionFailure( 24 | "Expected new to be of type \(Value.self), instead found \(old). This is programmer error.") 25 | return defaultValue() 26 | } 27 | return updateStrategy.update(typedOld, typedNew) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Internal/ClassReference.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 10/15/21. 2 | // Copyright © 2021 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - ClassReference 5 | 6 | /// A `Hashable` value wrapper around an `AnyClass` value 7 | /// - Unlike `ObjectIdentifier(class)`, `ClassReference(class)` 8 | /// preserves the `AnyClass` value and is more human-readable. 9 | struct ClassReference { 10 | init(_ class: AnyClass) { 11 | self.class = `class` 12 | } 13 | 14 | let `class`: AnyClass 15 | } 16 | 17 | // MARK: Equatable 18 | 19 | extension ClassReference: Equatable { 20 | static func ==(_ lhs: Self, _ rhs: Self) -> Bool { 21 | ObjectIdentifier(lhs.class) == ObjectIdentifier(rhs.class) 22 | } 23 | } 24 | 25 | // MARK: Hashable 26 | 27 | extension ClassReference: Hashable { 28 | func hash(into hasher: inout Hasher) { 29 | hasher.combine(ObjectIdentifier(`class`)) 30 | } 31 | } 32 | 33 | // MARK: CustomStringConvertible 34 | 35 | extension ClassReference: CustomStringConvertible { 36 | var description: String { 37 | String(describing: `class`) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/AnimatedProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/16/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | /// The capability of providing a flag indicating whether an operation should be animated. 5 | /// 6 | /// Typically conformed to by the `CallbackContext` of a `CallbackContextEpoxyModeled`. 7 | protocol AnimatedProviding { 8 | /// Whether this operation should be animated. 9 | var animated: Bool { get } 10 | } 11 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/DidDisplayProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 1/6/21. 2 | // Copyright © 2021 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - DidDisplayProviding 5 | 6 | /// A sentinel protocol for enabling an `CallbackContextEpoxyModeled` to provide a `didDisplay` 7 | /// closure property. 8 | /// 9 | /// - SeeAlso: `WillDisplayProviding` 10 | /// - SeeAlso: `DidEndDisplayingProviding` 11 | protocol DidDisplayProviding { } 12 | 13 | // MARK: - CallbackContextEpoxyModeled 14 | 15 | extension CallbackContextEpoxyModeled where Self: DidDisplayProviding { 16 | 17 | // MARK: Internal 18 | 19 | /// A closure that's called after a view has been added to the view hierarchy following any 20 | /// appearance animations. 21 | typealias DidDisplay = (_ context: CallbackContext) -> Void 22 | 23 | /// A closure that's called after the view has been added to the view hierarchy following any 24 | /// appearance animations. 25 | var didDisplay: DidDisplay? { 26 | get { self[didDisplayProperty] } 27 | set { self[didDisplayProperty] = newValue } 28 | } 29 | 30 | /// Returns a copy of this model with the given did display closure called after the current did 31 | /// display closure of this model, if there is one. 32 | func didDisplay(_ value: DidDisplay?) -> Self { 33 | copy(updating: didDisplayProperty, to: value) 34 | } 35 | 36 | // MARK: Private 37 | 38 | private var didDisplayProperty: EpoxyModelProperty { 39 | .init(keyPath: \Self.didDisplay, defaultValue: nil, updateStrategy: .chain()) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/DidEndDisplayingProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/15/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - DidEndDisplayingProviding 5 | 6 | /// A sentinel protocol for enabling an `CallbackContextEpoxyModeled` to provide a 7 | /// `didEndDisplaying` closure property. 8 | protocol DidEndDisplayingProviding { } 9 | 10 | // MARK: - CallbackContextEpoxyModeled 11 | 12 | extension CallbackContextEpoxyModeled where Self: DidEndDisplayingProviding { 13 | 14 | // MARK: Internal 15 | 16 | /// A closure that's called when a view is no longer displayed following any disappearance 17 | /// animations and when it has been removed from the view hierarchy. 18 | typealias DidEndDisplaying = (_ context: CallbackContext) -> Void 19 | 20 | /// A closure that's called when the view is no longer displayed following any disappearance 21 | /// animations and when it has been removed from the view hierarchy. 22 | var didEndDisplaying: DidEndDisplaying? { 23 | get { self[didEndDisplayingProperty] } 24 | set { self[didEndDisplayingProperty] = newValue } 25 | } 26 | 27 | /// Returns a copy of this model with the given did end displaying closure called after the 28 | /// current did end displaying closure of this model, if there is one. 29 | func didEndDisplaying(_ value: DidEndDisplaying?) -> Self { 30 | copy(updating: didEndDisplayingProperty, to: value) 31 | } 32 | 33 | // MARK: Private 34 | 35 | private var didEndDisplayingProperty: EpoxyModelProperty { 36 | .init( 37 | keyPath: \Self.didEndDisplaying, 38 | defaultValue: nil, 39 | updateStrategy: .chain()) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/DidSelectProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/2/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - DidSelectProviding 5 | 6 | /// A sentinel protocol for enabling an `CallbackContextEpoxyModeled` to provide a `didSelect` 7 | /// closure property. 8 | protocol DidSelectProviding { } 9 | 10 | // MARK: - CallbackContextEpoxyModeled 11 | 12 | extension CallbackContextEpoxyModeled where Self: DidSelectProviding { 13 | 14 | // MARK: Internal 15 | 16 | /// A closure that's called to handle this model's view being selected. 17 | typealias DidSelect = (CallbackContext) -> Void 18 | 19 | /// A closure that's called to handle this model's view being selected. 20 | var didSelect: DidSelect? { 21 | get { self[didSelectProperty] } 22 | set { self[didSelectProperty] = newValue } 23 | } 24 | 25 | /// Returns a copy of this model with the given did select closure called after the current did 26 | /// select closure of this model, if there is one. 27 | func didSelect(_ value: DidSelect?) -> Self { 28 | copy(updating: didSelectProperty, to: value) 29 | } 30 | 31 | // MARK: Private 32 | 33 | private var didSelectProperty: EpoxyModelProperty { 34 | .init(keyPath: \Self.didSelect, defaultValue: nil, updateStrategy: .chain()) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/SetBehaviorsProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/2/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - SetBehaviorsProviding 5 | 6 | /// A sentinel protocol for enabling an `CallbackContextEpoxyModeled` to provide a `setBehaviors` 7 | /// closure property. 8 | protocol SetBehaviorsProviding { } 9 | 10 | // MARK: - CallbackContextEpoxyModeled 11 | 12 | extension CallbackContextEpoxyModeled where Self: SetBehaviorsProviding { 13 | 14 | // MARK: Internal 15 | 16 | /// A closure that's called to set the content on this model's view with behaviors (e.g. tap handler 17 | /// closures) whenever this model is updated. 18 | typealias SetBehaviors = (CallbackContext) -> Void 19 | 20 | /// A closure that's called to set the content on this model's view with behaviors (e.g. tap handler 21 | /// closures) whenever this model is updated. 22 | var setBehaviors: SetBehaviors? { 23 | get { self[setBehaviorsProperty] } 24 | set { self[setBehaviorsProperty] = newValue } 25 | } 26 | 27 | /// Returns a copy of this model with the set behaviors closure called after the current set 28 | /// behaviors closure of this model, if there is one. 29 | func setBehaviors(_ value: SetBehaviors?) -> Self { 30 | copy(updating: setBehaviorsProperty, to: value) 31 | } 32 | 33 | // MARK: Private 34 | 35 | private var setBehaviorsProperty: EpoxyModelProperty { 36 | .init(keyPath: \Self.setBehaviors, defaultValue: nil, updateStrategy: .chain()) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/SetContentProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/1/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - SetContentProviding 5 | 6 | /// A sentinel protocol for enabling an `CallbackContextEpoxyModeled` to provide a `setContent` 7 | /// closure property. 8 | protocol SetContentProviding { } 9 | 10 | // MARK: - CallbackContextEpoxyModeled 11 | 12 | extension CallbackContextEpoxyModeled where Self: SetContentProviding { 13 | 14 | // MARK: Internal 15 | 16 | /// A closure that's called to set the content on this model's view when it is first created and 17 | /// subsequently when the content changes. 18 | typealias SetContent = (CallbackContext) -> Void 19 | 20 | /// A closure that's called to set the content on this model's view when it is first created and 21 | /// subsequently when the content changes. 22 | var setContent: SetContent? { 23 | get { self[setContentProperty] } 24 | set { self[setContentProperty] = newValue } 25 | } 26 | 27 | /// Returns a copy of this model with the given setContent view closure called after the current 28 | /// setContent view closure of this model, if there is one. 29 | func setContent(_ value: SetContent?) -> Self { 30 | copy(updating: setContentProperty, to: value) 31 | } 32 | 33 | // MARK: Private 34 | 35 | private var setContentProperty: EpoxyModelProperty { 36 | .init(keyPath: \Self.setContent, defaultValue: nil, updateStrategy: .chain()) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/StyleIDProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/1/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - StyleIDProviding 5 | 6 | protocol StyleIDProviding { 7 | /// An optional ID for a style type to use for reuse of a view. 8 | /// 9 | /// Use this to differentiate between different styling configurations. 10 | var styleID: AnyHashable? { get } 11 | } 12 | 13 | // MARK: - EpoxyModeled 14 | 15 | extension EpoxyModeled where Self: StyleIDProviding { 16 | 17 | // MARK: Internal 18 | 19 | var styleID: AnyHashable? { 20 | get { self[styleIDProperty] } 21 | set { self[styleIDProperty] = newValue } 22 | } 23 | 24 | /// Returns a copy of this model with the `styleID` replaced with the provided `value`. 25 | func styleID(_ value: AnyHashable?) -> Self { 26 | copy(updating: styleIDProperty, to: value) 27 | } 28 | 29 | // MARK: Private 30 | 31 | private var styleIDProperty: EpoxyModelProperty { 32 | .init( 33 | keyPath: \StyleIDProviding.styleID, 34 | defaultValue: nil, 35 | updateStrategy: .replace) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/TraitCollectionProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/16/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | #if !os(macOS) 5 | import UIKit 6 | 7 | /// The capability of providing a `UITraitCollection` instance. 8 | /// 9 | /// Typically conformed to by the `CallbackContext` of a `CallbackContextEpoxyModeled`. 10 | protocol TraitCollectionProviding { 11 | /// The `UITraitCollection` instance provided by this type. 12 | var traitCollection: UITraitCollection { get } 13 | } 14 | #endif 15 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/ViewDifferentiatorProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by Bryan Keller on 12/17/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - ViewDifferentiatorProviding 5 | 6 | /// The capability of providing a view differentiator that facilitates generating collection view 7 | /// cell reuse identifiers. 8 | protocol ViewDifferentiatorProviding { 9 | /// The view differentiator for the item model. 10 | var viewDifferentiator: ViewDifferentiator { get } 11 | } 12 | 13 | // MARK: - ViewDifferentiator 14 | 15 | /// Facilitates differentiating between two models' views, based on their view type, optional style 16 | /// identifier, and optional element kind for supplementary view models. If two models have the same 17 | /// view differentiator, then they're compatible with one another for element reuse. If two models 18 | /// have different view differentiators, then they're incompatible with one another for element 19 | /// reuse. 20 | struct ViewDifferentiator: Hashable { 21 | 22 | // MARK: Lifecycle 23 | 24 | init(viewType: AnyClass, styleID: AnyHashable?) { 25 | viewTypeDescription = "\(type(of: viewType.self))" 26 | self.styleID = styleID 27 | } 28 | 29 | // MARK: Public 30 | 31 | var viewTypeDescription: String 32 | var styleID: AnyHashable? 33 | 34 | } 35 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/ViewProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/16/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | /// The capability of providing an `View` instance 5 | /// 6 | /// Typically conformed to by the `CallbackContext` of a `CallbackContextEpoxyModeled`. 7 | protocol ViewProviding { 8 | /// The `UIView` view of this type. 9 | associatedtype View: ViewType 10 | 11 | /// The `UIView` view instance provided by this type. 12 | var view: View { get } 13 | } 14 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/Providers/WillDisplayProviding.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/15/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - WillDisplayProviding 5 | 6 | /// A sentinel protocol for enabling an `CallbackContextEpoxyModeled` to provide a `willDisplay` 7 | /// closure property. 8 | /// 9 | /// - SeeAlso: `DidDisplayProviding` 10 | /// - SeeAlso: `DidEndDisplayingProviding` 11 | protocol WillDisplayProviding { } 12 | 13 | // MARK: - CallbackContextEpoxyModeled 14 | 15 | extension CallbackContextEpoxyModeled where Self: WillDisplayProviding { 16 | 17 | // MARK: Internal 18 | 19 | /// A closure that's called when a view is about to be displayed, before it has been added to the 20 | /// view hierarcy. 21 | typealias WillDisplay = (_ context: CallbackContext) -> Void 22 | 23 | /// A closure that's called when the view is about to be displayed, before it has been added to 24 | /// the view hierarcy. 25 | var willDisplay: WillDisplay? { 26 | get { self[willDisplayProperty] } 27 | set { self[willDisplayProperty] = newValue } 28 | } 29 | 30 | /// Returns a copy of this model with the given will display closure called after the current will 31 | /// display closure of this model, if there is one. 32 | func willDisplay(_ value: WillDisplay?) -> Self { 33 | copy(updating: willDisplayProperty, to: value) 34 | } 35 | 36 | // MARK: Private 37 | 38 | private var willDisplayProperty: EpoxyModelProperty { 39 | .init(keyPath: \Self.willDisplay, defaultValue: nil, updateStrategy: .chain()) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Model/ViewEpoxyModeled.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 12/4/20. 2 | // Copyright © 2020 Airbnb Inc. All rights reserved. 3 | 4 | /// An Epoxy model with an associated `UIView` type. 5 | protocol ViewEpoxyModeled: EpoxyModeled { 6 | /// The view type associated with this model. 7 | /// 8 | /// An instance of this view is typically configured by this model. 9 | associatedtype View: ViewType 10 | } 11 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/SwiftUI/EpoxySwiftUIIntrinsicContentSizeInvalidator.swift: -------------------------------------------------------------------------------- 1 | // Created by matthew_cheok on 11/19/21. 2 | // Copyright © 2021 Airbnb Inc. All rights reserved. 3 | 4 | import SwiftUI 5 | 6 | // MARK: - EpoxyIntrinsicContentSizeInvalidator 7 | 8 | /// Allows the SwiftUI view contained in an Epoxy model to request the invalidation of 9 | /// the container's intrinsic content size. 10 | /// 11 | /// ``` 12 | /// @Environment(\.epoxyIntrinsicContentSizeInvalidator) var invalidateIntrinsicContentSize 13 | /// 14 | /// var body: some View { 15 | /// ... 16 | /// .onChange(of: size) { 17 | /// invalidateIntrinsicContentSize() 18 | /// } 19 | /// } 20 | /// ``` 21 | struct EpoxyIntrinsicContentSizeInvalidator { 22 | let invalidate: () -> Void 23 | 24 | func callAsFunction() { 25 | invalidate() 26 | } 27 | } 28 | 29 | // MARK: - EnvironmentValues 30 | 31 | @available(iOS 13.0, tvOS 13.0, macOS 10.15, *) 32 | extension EnvironmentValues { 33 | /// A means of invalidating the intrinsic content size of the parent `EpoxySwiftUIHostingView`. 34 | var epoxyIntrinsicContentSizeInvalidator: EpoxyIntrinsicContentSizeInvalidator { 35 | get { self[EpoxyIntrinsicContentSizeInvalidatorKey.self] } 36 | set { self[EpoxyIntrinsicContentSizeInvalidatorKey.self] = newValue } 37 | } 38 | } 39 | 40 | // MARK: - EpoxyIntrinsicContentSizeInvalidatorKey 41 | 42 | private struct EpoxyIntrinsicContentSizeInvalidatorKey: EnvironmentKey { 43 | static let defaultValue = EpoxyIntrinsicContentSizeInvalidator(invalidate: { }) 44 | } 45 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/SwiftUI/UIView+SwiftUIView.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 3/3/22. 2 | // Copyright © 2022 Airbnb Inc. All rights reserved. 3 | 4 | import SwiftUI 5 | 6 | // MARK: - ViewTypeProtocol + swiftUIView 7 | 8 | @available(iOS 13.0, tvOS 13.0, macOS 10.15, *) 9 | extension ViewTypeProtocol { 10 | /// Returns a SwiftUI `View` representing this `UIView`, constructed with the given `makeView` 11 | /// closure and sized with the given sizing configuration. 12 | /// 13 | /// To perform additional configuration of the `UIView` instance, call `configure` on the 14 | /// returned SwiftUI `View`: 15 | /// ``` 16 | /// MyUIView.swiftUIView(…) 17 | /// .configure { context in 18 | /// context.view.doSomething() 19 | /// } 20 | /// ``` 21 | /// 22 | /// To configure the sizing behavior of the `UIView` instance, call `sizing` on the returned 23 | /// SwiftUI `View`: 24 | /// ``` 25 | /// MyView.swiftUIView(…).sizing(.intrinsicSize) 26 | /// ``` 27 | /// The sizing defaults to `.automatic`. 28 | static func swiftUIView(makeView: @escaping () -> Self) -> SwiftUIView { 29 | SwiftUIView(makeContent: makeView) 30 | } 31 | } 32 | 33 | // MARK: - ViewTypeProtocol 34 | 35 | /// A protocol that all `UIView`s conform to, enabling extensions that have a `Self` reference. 36 | protocol ViewTypeProtocol: ViewType { } 37 | 38 | // MARK: - ViewType + ViewTypeProtocol 39 | 40 | extension ViewType: ViewTypeProtocol { } 41 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Views/ContentConfigurableView.swift: -------------------------------------------------------------------------------- 1 | // Created by Laura Skelton on 5/30/17. 2 | // Copyright © 2017 Airbnb. All rights reserved. 3 | 4 | // MARK: - ContentConfigurableView 5 | 6 | /// A view that can be configured with a `Content` instance that contains the view's `Equatable` 7 | /// properties that can be updated on existing view instances, e.g. text `String`s or image `URL`s. 8 | /// 9 | /// For performance, it is generally expected that `Content` is only set when it is not equal to the 10 | /// previous `Content` instance that has been set on a view instance. As a further optimization, 11 | /// this view can guard updates on the equality of each property of the `Content` against the 12 | /// current property value when set. 13 | /// 14 | /// Properties of `Content` should be mutually exclusive with the properties of the 15 | /// `StyledView.Style` and `BehaviorsConfigurableView.Behaviors`. 16 | /// 17 | /// - SeeAlso: `BehaviorsConfigurableView` 18 | /// - SeeAlso: `StyledView` 19 | /// - SeeAlso: `EpoxyableView` 20 | protocol ContentConfigurableView: ViewType { 21 | /// The `Equatable` properties that can be updated on instances of this view, e.g. text `String`s 22 | /// or image `URL`s. 23 | /// 24 | /// Defaults to `Never` for views that do not have `Content`. 25 | associatedtype Content: Equatable = Never 26 | 27 | /// Updates the content of this view to the properties of the given `content`, optionally 28 | /// animating the updates. 29 | func setContent(_ content: Self.Content, animated: Bool) 30 | } 31 | 32 | // MARK: Defaults 33 | 34 | extension ContentConfigurableView where Content == Never { 35 | func setContent(_: Never, animated _: Bool) { } 36 | } 37 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/EpoxyCore/Views/EpoxyableView.swift: -------------------------------------------------------------------------------- 1 | // Created by eric_horacek on 1/13/21. 2 | // Copyright © 2021 Airbnb Inc. All rights reserved. 3 | 4 | /// A `UIView` that can be declaratively configured via a concrete `EpoxyableModel` instance. 5 | typealias EpoxyableView = BehaviorsConfigurableView & ContentConfigurableView & StyledView 6 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/ZipFoundation/Archive+ReadingDeprecated.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Archive+ReadingDeprecated.swift 3 | // ZIPFoundation 4 | // 5 | // Copyright © 2017-2021 Thomas Zoechling, https://www.peakstep.com and the ZIP Foundation project authors. 6 | // Released under the MIT License. 7 | // 8 | // See https://github.com/weichsel/ZIPFoundation/blob/master/LICENSE for license information. 9 | // 10 | 11 | import Foundation 12 | 13 | extension Archive { 14 | 15 | @available( 16 | *, 17 | deprecated, 18 | message: "Please use `Int` for `bufferSize`.") 19 | func extract( 20 | _ entry: Entry, 21 | to url: URL, 22 | bufferSize: UInt32, 23 | skipCRC32: Bool = false, 24 | progress: Progress? = nil) 25 | throws -> CRC32 26 | { 27 | try extract(entry, to: url, bufferSize: Int(bufferSize), skipCRC32: skipCRC32, progress: progress) 28 | } 29 | 30 | @available( 31 | *, 32 | deprecated, 33 | message: "Please use `Int` for `bufferSize`.") 34 | func extract( 35 | _ entry: Entry, 36 | bufferSize: UInt32, 37 | skipCRC32: Bool = false, 38 | progress: Progress? = nil, 39 | consumer: Consumer) 40 | throws -> CRC32 41 | { 42 | try extract( 43 | entry, 44 | bufferSize: Int(bufferSize), 45 | skipCRC32: skipCRC32, 46 | progress: progress, 47 | consumer: consumer) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/ZipFoundation/Data+CompressionDeprecated.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Data+CompressionDeprecated.swift 3 | // ZIPFoundation 4 | // 5 | // Copyright © 2017-2021 Thomas Zoechling, https://www.peakstep.com and the ZIP Foundation project authors. 6 | // Released under the MIT License. 7 | // 8 | // See https://github.com/weichsel/ZIPFoundation/blob/master/LICENSE for license information. 9 | // 10 | 11 | import Foundation 12 | 13 | extension Data { 14 | 15 | @available(*, deprecated, message: "Please use `Int64` for `size` and provider `position`.") 16 | static func compress( 17 | size: Int, 18 | bufferSize: Int, 19 | provider: (_ position: Int, _ size: Int) throws -> Data, 20 | consumer: Consumer) 21 | throws -> CRC32 22 | { 23 | let newProvider: Provider = { try provider(Int($0), $1) } 24 | return try compress(size: Int64(size), bufferSize: bufferSize, provider: newProvider, consumer: consumer) 25 | } 26 | 27 | @available(*, deprecated, message: "Please use `Int64` for `size` and provider `position`.") 28 | static func decompress( 29 | size: Int, 30 | bufferSize: Int, 31 | skipCRC32: Bool, 32 | provider: (_ position: Int, _ size: Int) throws -> Data, 33 | consumer: Consumer) 34 | throws -> CRC32 35 | { 36 | let newProvider: Provider = { try provider(Int($0), $1) } 37 | return try decompress( 38 | size: Int64(size), 39 | bufferSize: bufferSize, 40 | skipCRC32: skipCRC32, 41 | provider: newProvider, 42 | consumer: consumer) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/EmbeddedLibraries/ZipFoundation/URL+ZIP.swift: -------------------------------------------------------------------------------- 1 | // 2 | // URL+ZIP.swift 3 | // ZIPFoundation 4 | // 5 | // Copyright © 2017-2021 Thomas Zoechling, https://www.peakstep.com and the ZIP Foundation project authors. 6 | // Released under the MIT License. 7 | // 8 | // See https://github.com/weichsel/ZIPFoundation/blob/master/LICENSE for license information. 9 | // 10 | 11 | import Foundation 12 | 13 | extension URL { 14 | 15 | static func temporaryReplacementDirectoryURL(for archive: Archive) -> URL { 16 | #if swift(>=5.0) || os(macOS) || os(iOS) || os(watchOS) || os(tvOS) 17 | if 18 | archive.url.isFileURL, 19 | let tempDir = try? FileManager().url( 20 | for: .itemReplacementDirectory, 21 | in: .userDomainMask, 22 | appropriateFor: archive.url, 23 | create: true) 24 | { 25 | return tempDir 26 | } 27 | #endif 28 | 29 | return URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent( 30 | ProcessInfo.processInfo.globallyUniqueString) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/LayerContainers/CompLayers/ImageCompositionLayer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageCompositionLayer.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/25/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | import QuartzCore 11 | 12 | final class ImageCompositionLayer: CompositionLayer { 13 | 14 | // MARK: Lifecycle 15 | 16 | init(imageLayer: ImageLayerModel, size: CGSize) { 17 | imageReferenceID = imageLayer.referenceID 18 | super.init(layer: imageLayer, size: size) 19 | contentsLayer.masksToBounds = true 20 | contentsLayer.contentsGravity = CALayerContentsGravity.resize 21 | } 22 | 23 | override init(layer: Any) { 24 | /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init 25 | guard let layer = layer as? ImageCompositionLayer else { 26 | fatalError("init(layer:) Wrong Layer Class") 27 | } 28 | imageReferenceID = layer.imageReferenceID 29 | image = nil 30 | super.init(layer: layer) 31 | } 32 | 33 | required init?(coder _: NSCoder) { 34 | fatalError("init(coder:) has not been implemented") 35 | } 36 | 37 | // MARK: Internal 38 | 39 | let imageReferenceID: String 40 | 41 | var image: CGImage? = nil { 42 | didSet { 43 | if let image = image { 44 | contentsLayer.contents = image 45 | } else { 46 | contentsLayer.contents = nil 47 | } 48 | } 49 | } 50 | 51 | var imageContentsGravity: CALayerContentsGravity = .resize { 52 | didSet { 53 | contentsLayer.contentsGravity = imageContentsGravity 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/LayerContainers/CompLayers/NullCompositionLayer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NullCompositionLayer.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/25/19. 6 | // 7 | 8 | import Foundation 9 | 10 | final class NullCompositionLayer: CompositionLayer { 11 | 12 | init(layer: LayerModel) { 13 | super.init(layer: layer, size: .zero) 14 | } 15 | 16 | required init?(coder _: NSCoder) { 17 | fatalError("init(coder:) has not been implemented") 18 | } 19 | 20 | override init(layer: Any) { 21 | /// Used for creating shadow model layers. Read More here: https://developer.apple.com/documentation/quartzcore/calayer/1410842-init 22 | guard let layer = layer as? NullCompositionLayer else { 23 | fatalError("init(layer:) Wrong Layer Class") 24 | } 25 | super.init(layer: layer) 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/LayerContainers/Utility/InvertedMatteLayer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InvertedMatteLayer.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/28/19. 6 | // 7 | 8 | import Foundation 9 | import QuartzCore 10 | 11 | /// A layer that inverses the alpha output of its input layer. 12 | /// 13 | /// WARNING: This is experimental and probably not very performant. 14 | final class InvertedMatteLayer: CALayer, CompositionLayerDelegate { 15 | 16 | // MARK: Lifecycle 17 | 18 | init(inputMatte: CompositionLayer) { 19 | self.inputMatte = inputMatte 20 | super.init() 21 | inputMatte.layerDelegate = self 22 | anchorPoint = .zero 23 | bounds = inputMatte.bounds 24 | setNeedsDisplay() 25 | } 26 | 27 | override init(layer: Any) { 28 | guard let layer = layer as? InvertedMatteLayer else { 29 | fatalError("init(layer:) wrong class.") 30 | } 31 | inputMatte = nil 32 | super.init(layer: layer) 33 | } 34 | 35 | required init?(coder _: NSCoder) { 36 | fatalError("init(coder:) has not been implemented") 37 | } 38 | 39 | // MARK: Internal 40 | 41 | let inputMatte: CompositionLayer? 42 | let wrapperLayer = CALayer() 43 | 44 | func frameUpdated(frame _: CGFloat) { 45 | setNeedsDisplay() 46 | displayIfNeeded() 47 | } 48 | 49 | override func draw(in ctx: CGContext) { 50 | guard let inputMatte = inputMatte else { return } 51 | ctx.setFillColor(.rgb(0, 0, 0)) 52 | ctx.fill(bounds) 53 | ctx.setBlendMode(.destinationOut) 54 | inputMatte.render(in: ctx) 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LayerFontProvider.swift 3 | // Lottie 4 | // 5 | // Created by Brandon Withrow on 8/5/20. 6 | // Copyright © 2020 YurtvilleProds. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Connects a LottieFontProvider to a group of text layers 12 | final class LayerFontProvider { 13 | 14 | // MARK: Lifecycle 15 | 16 | init(fontProvider: AnimationFontProvider) { 17 | self.fontProvider = fontProvider 18 | textLayers = [] 19 | reloadTexts() 20 | } 21 | 22 | // MARK: Internal 23 | 24 | private(set) var textLayers: [TextCompositionLayer] 25 | 26 | var fontProvider: AnimationFontProvider { 27 | didSet { 28 | reloadTexts() 29 | } 30 | } 31 | 32 | func addTextLayers(_ layers: [TextCompositionLayer]) { 33 | textLayers += layers 34 | } 35 | 36 | func reloadTexts() { 37 | for textLayer in textLayers { 38 | textLayer.fontProvider = fontProvider 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/LayerContainers/Utility/LayerImageProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LayerImageProvider.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/25/19. 6 | // 7 | 8 | import Foundation 9 | 10 | /// Connects a LottieImageProvider to a group of image layers 11 | final class LayerImageProvider { 12 | 13 | // MARK: Lifecycle 14 | 15 | init(imageProvider: AnimationImageProvider, assets: [String: ImageAsset]?) { 16 | self.imageProvider = imageProvider 17 | imageLayers = [ImageCompositionLayer]() 18 | if let assets = assets { 19 | imageAssets = assets 20 | } else { 21 | imageAssets = [:] 22 | } 23 | reloadImages() 24 | } 25 | 26 | // MARK: Internal 27 | 28 | private(set) var imageLayers: [ImageCompositionLayer] 29 | let imageAssets: [String: ImageAsset] 30 | 31 | var imageProvider: AnimationImageProvider { 32 | didSet { 33 | reloadImages() 34 | } 35 | } 36 | 37 | func addImageLayers(_ layers: [ImageCompositionLayer]) { 38 | for layer in layers { 39 | if imageAssets[layer.imageReferenceID] != nil { 40 | /// Found a linking asset in our asset library. Add layer 41 | imageLayers.append(layer) 42 | } 43 | } 44 | } 45 | 46 | func reloadImages() { 47 | for imageLayer in imageLayers { 48 | if let asset = imageAssets[imageLayer.imageReferenceID] { 49 | imageLayer.image = imageProvider.imageForAsset(asset: asset) 50 | imageLayer.imageContentsGravity = imageProvider.contentsGravity(for: asset) 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LayerTextProvider.swift 3 | // lottie-ios-iOS 4 | // 5 | // Created by Alexandr Goncharov on 07/06/2019. 6 | // 7 | 8 | import Foundation 9 | 10 | /// Connects a LottieTextProvider to a group of text layers 11 | final class LayerTextProvider { 12 | 13 | // MARK: Lifecycle 14 | 15 | init(textProvider: AnimationKeypathTextProvider) { 16 | self.textProvider = textProvider 17 | textLayers = [] 18 | reloadTexts() 19 | } 20 | 21 | // MARK: Internal 22 | 23 | private(set) var textLayers: [TextCompositionLayer] 24 | 25 | var textProvider: AnimationKeypathTextProvider { 26 | didSet { 27 | reloadTexts() 28 | } 29 | } 30 | 31 | func addTextLayers(_ layers: [TextCompositionLayer]) { 32 | textLayers += layers 33 | } 34 | 35 | func reloadTexts() { 36 | for textLayer in textLayers { 37 | textLayer.textProvider = textProvider 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/NodeProperty.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NodeProperty.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/30/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | 11 | /// A node property that holds a reference to a T ValueProvider and a T ValueContainer. 12 | class NodeProperty: AnyNodeProperty { 13 | 14 | // MARK: Lifecycle 15 | 16 | init(provider: AnyValueProvider) { 17 | valueProvider = provider 18 | originalValueProvider = valueProvider 19 | typedContainer = ValueContainer(provider.value(frame: 0) as! T) 20 | typedContainer.setNeedsUpdate() 21 | } 22 | 23 | // MARK: Internal 24 | 25 | var valueProvider: AnyValueProvider 26 | var originalValueProvider: AnyValueProvider 27 | 28 | var valueType: Any.Type { T.self } 29 | 30 | var value: T { 31 | typedContainer.outputValue 32 | } 33 | 34 | var valueContainer: AnyValueContainer { 35 | typedContainer 36 | } 37 | 38 | func needsUpdate(frame: CGFloat) -> Bool { 39 | valueContainer.needsUpdate || valueProvider.hasUpdate(frame: frame) 40 | } 41 | 42 | func setProvider(provider: AnyValueProvider) { 43 | guard provider.valueType == valueType else { return } 44 | valueProvider = provider 45 | valueContainer.setNeedsUpdate() 46 | } 47 | 48 | func update(frame: CGFloat) { 49 | typedContainer.setValue(valueProvider.value(frame: frame), forFrame: frame) 50 | } 51 | 52 | // MARK: Fileprivate 53 | 54 | fileprivate var typedContainer: ValueContainer 55 | } 56 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnyNodeProperty.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/30/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | 11 | // MARK: - AnyNodeProperty 12 | 13 | /// A property of a node. The node property holds a provider and a container 14 | protocol AnyNodeProperty { 15 | 16 | /// Returns true if the property needs to recompute its stored value 17 | func needsUpdate(frame: CGFloat) -> Bool 18 | 19 | /// Updates the property for the frame 20 | func update(frame: CGFloat) 21 | 22 | /// The stored value container for the property 23 | var valueContainer: AnyValueContainer { get } 24 | 25 | /// The value provider for the property 26 | var valueProvider: AnyValueProvider { get } 27 | 28 | /// The original value provider for the property 29 | var originalValueProvider: AnyValueProvider { get } 30 | 31 | /// The Type of the value provider 32 | var valueType: Any.Type { get } 33 | 34 | /// Sets the value provider for the property. 35 | func setProvider(provider: AnyValueProvider) 36 | } 37 | 38 | extension AnyNodeProperty { 39 | 40 | /// Returns the most recently computed value for the keypath, returns nil if property wasn't found 41 | func getValueOfType() -> T? { 42 | valueContainer.value as? T 43 | } 44 | 45 | /// Returns the most recently computed value for the keypath, returns nil if property wasn't found 46 | func getValue() -> Any? { 47 | valueContainer.value 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnyValueContainer.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/30/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | 11 | /// The container for the value of a property. 12 | protocol AnyValueContainer: AnyObject { 13 | 14 | /// The stored value of the container 15 | var value: Any { get } 16 | 17 | /// Notifies the provider that it should update its container 18 | func setNeedsUpdate() 19 | 20 | /// When true the container needs to have its value updated by its provider 21 | var needsUpdate: Bool { get } 22 | 23 | /// The frame time of the last provided update 24 | var lastUpdateFrame: CGFloat { get } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeypathSettable.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 2/4/19. 6 | // 7 | 8 | import Foundation 9 | import QuartzCore 10 | 11 | /// Protocol that provides keypath search functionality. Returns all node properties associated with a keypath. 12 | protocol KeypathSearchable { 13 | 14 | /// The name of the Keypath 15 | var keypathName: String { get } 16 | 17 | /// A list of properties belonging to the keypath. 18 | var keypathProperties: [String: AnyNodeProperty] { get } 19 | 20 | /// Children Keypaths 21 | var childKeypaths: [KeypathSearchable] { get } 22 | 23 | var keypathLayer: CALayer? { get } 24 | } 25 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NodePropertyMap.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/21/19. 6 | // 7 | 8 | import Foundation 9 | import QuartzCore 10 | 11 | // MARK: - NodePropertyMap 12 | 13 | protocol NodePropertyMap { 14 | var properties: [AnyNodeProperty] { get } 15 | } 16 | 17 | extension NodePropertyMap { 18 | 19 | var childKeypaths: [KeypathSearchable] { 20 | [] 21 | } 22 | 23 | var keypathLayer: CALayer? { 24 | nil 25 | } 26 | 27 | /// Checks if the node's local contents need to be rebuilt. 28 | func needsLocalUpdate(frame: CGFloat) -> Bool { 29 | for property in properties { 30 | if property.needsUpdate(frame: frame) { 31 | return true 32 | } 33 | } 34 | return false 35 | } 36 | 37 | /// Rebuilds only the local nodes that have an update for the frame 38 | func updateNodeProperties(frame: CGFloat) { 39 | for property in properties { 40 | property.update(frame: frame) 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/ValueContainer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ValueContainer.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/30/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | 11 | /// A container for a node value that is Typed to T. 12 | class ValueContainer: AnyValueContainer { 13 | 14 | // MARK: Lifecycle 15 | 16 | init(_ value: T) { 17 | outputValue = value 18 | } 19 | 20 | // MARK: Internal 21 | 22 | private(set) var lastUpdateFrame = CGFloat.infinity 23 | 24 | fileprivate(set) var needsUpdate = true 25 | 26 | var value: Any { 27 | outputValue as Any 28 | } 29 | 30 | var outputValue: T { 31 | didSet { 32 | needsUpdate = false 33 | } 34 | } 35 | 36 | func setValue(_ value: Any, forFrame: CGFloat) { 37 | if let typedValue = value as? T { 38 | needsUpdate = false 39 | lastUpdateFrame = forFrame 40 | outputValue = typedValue 41 | } 42 | } 43 | 44 | func setNeedsUpdate() { 45 | needsUpdate = true 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeyframeGroupInterpolator.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/22/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | 11 | /// A value provider that produces an array of values from an array of Keyframe Interpolators 12 | final class GroupInterpolator: ValueProvider where ValueType: Interpolatable { 13 | 14 | // MARK: Lifecycle 15 | 16 | /// Initialize with an array of array of keyframes. 17 | init(keyframeGroups: ContiguousArray>>) { 18 | keyframeInterpolators = ContiguousArray(keyframeGroups.map { KeyframeInterpolator(keyframes: $0) }) 19 | } 20 | 21 | // MARK: Internal 22 | 23 | let keyframeInterpolators: ContiguousArray> 24 | 25 | var valueType: Any.Type { 26 | [ValueType].self 27 | } 28 | 29 | var storage: ValueProviderStorage<[ValueType]> { 30 | .closure { frame in 31 | self.keyframeInterpolators.map { $0.value(frame: frame) as! ValueType } 32 | } 33 | } 34 | 35 | func hasUpdate(frame: CGFloat) -> Bool { 36 | let updated = keyframeInterpolators.first(where: { $0.hasUpdate(frame: frame) }) 37 | return updated != nil 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SingleValueProvider.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/30/19. 6 | // 7 | 8 | import Foundation 9 | import QuartzCore 10 | 11 | /// Returns a value for every frame. 12 | final class SingleValueProvider: ValueProvider { 13 | 14 | // MARK: Lifecycle 15 | 16 | init(_ value: ValueType) { 17 | self.value = value 18 | } 19 | 20 | // MARK: Internal 21 | 22 | var value: ValueType { 23 | didSet { 24 | hasUpdate = true 25 | } 26 | } 27 | 28 | var storage: ValueProviderStorage { 29 | .singleValue(value) 30 | } 31 | 32 | var valueType: Any.Type { 33 | ValueType.self 34 | } 35 | 36 | func hasUpdate(frame _: CGFloat) -> Bool { 37 | hasUpdate 38 | } 39 | 40 | // MARK: Private 41 | 42 | private var hasUpdate = true 43 | } 44 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PassThroughOutputNode.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/30/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | 11 | class PassThroughOutputNode: NodeOutput { 12 | 13 | // MARK: Lifecycle 14 | 15 | init(parent: NodeOutput?) { 16 | self.parent = parent 17 | } 18 | 19 | // MARK: Internal 20 | 21 | let parent: NodeOutput? 22 | 23 | var hasUpdate = false 24 | var isEnabled = true 25 | 26 | var outputPath: CGPath? { 27 | if let parent = parent { 28 | return parent.outputPath 29 | } 30 | return nil 31 | } 32 | 33 | func hasOutputUpdates(_ forFrame: CGFloat) -> Bool { 34 | /// Changes to this node do not affect downstream nodes. 35 | let parentUpdate = parent?.hasOutputUpdates(forFrame) ?? false 36 | /// Changes to upstream nodes do, however, affect this nodes state. 37 | hasUpdate = hasUpdate || parentUpdate 38 | return parentUpdate 39 | } 40 | 41 | func hasRenderUpdates(_ forFrame: CGFloat) -> Bool { 42 | /// Return true if there are upstream updates or if this node has updates 43 | let upstreamUpdates = parent?.hasOutputUpdates(forFrame) ?? false 44 | hasUpdate = hasUpdate || upstreamUpdates 45 | return hasUpdate 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FillRenderer.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/30/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | import QuartzCore 11 | 12 | extension FillRule { 13 | var cgFillRule: CGPathFillRule { 14 | switch self { 15 | case .evenOdd: 16 | return .evenOdd 17 | default: 18 | return .winding 19 | } 20 | } 21 | 22 | var caFillRule: CAShapeLayerFillRule { 23 | switch self { 24 | case .evenOdd: 25 | return CAShapeLayerFillRule.evenOdd 26 | default: 27 | return CAShapeLayerFillRule.nonZero 28 | } 29 | } 30 | } 31 | 32 | // MARK: - FillRenderer 33 | 34 | /// A rendered for a Path Fill 35 | final class FillRenderer: PassThroughOutputNode, Renderable { 36 | var shouldRenderInContext = false 37 | 38 | var color: CGColor? { 39 | didSet { 40 | hasUpdate = true 41 | } 42 | } 43 | 44 | var opacity: CGFloat = 0 { 45 | didSet { 46 | hasUpdate = true 47 | } 48 | } 49 | 50 | var fillRule: FillRule = .none { 51 | didSet { 52 | hasUpdate = true 53 | } 54 | } 55 | 56 | func render(_: CGContext) { 57 | // do nothing 58 | } 59 | 60 | func setupSublayers(layer _: CAShapeLayer) { 61 | // do nothing 62 | } 63 | 64 | func updateShapeLayer(layer: CAShapeLayer) { 65 | layer.fillColor = color 66 | layer.opacity = Float(opacity) 67 | layer.fillRule = fillRule.caFillRule 68 | hasUpdate = false 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/MainThread/NodeRenderSystem/Protocols/PathNode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PathNode.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/17/19. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - PathNode 11 | 12 | protocol PathNode { 13 | var pathOutput: PathOutputNode { get } 14 | } 15 | 16 | extension PathNode where Self: AnimatorNode { 17 | 18 | var outputNode: NodeOutput { 19 | pathOutput 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/Assets/Asset.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Asset.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/9/19. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - Asset 11 | 12 | public class Asset: Codable, DictionaryInitializable { 13 | 14 | // MARK: Lifecycle 15 | 16 | required public init(from decoder: Decoder) throws { 17 | let container = try decoder.container(keyedBy: Asset.CodingKeys.self) 18 | if let id = try? container.decode(String.self, forKey: .id) { 19 | self.id = id 20 | } else { 21 | id = String(try container.decode(Int.self, forKey: .id)) 22 | } 23 | } 24 | 25 | required init(dictionary: [String: Any]) throws { 26 | if let id = dictionary[CodingKeys.id.rawValue] as? String { 27 | self.id = id 28 | } else if let id = dictionary[CodingKeys.id.rawValue] as? Int { 29 | self.id = String(id) 30 | } else { 31 | throw InitializableError.invalidInput 32 | } 33 | } 34 | 35 | // MARK: Public 36 | 37 | /// The ID of the asset 38 | public let id: String 39 | 40 | // MARK: Private 41 | 42 | private enum CodingKeys: String, CodingKey { 43 | case id 44 | } 45 | } 46 | 47 | // MARK: Sendable 48 | 49 | /// Since `Asset` isn't `final`, we have to use `@unchecked Sendable` instead of `Sendable.` 50 | /// All `Asset` subclasses are immutable `Sendable` values. 51 | extension Asset: @unchecked Sendable { } 52 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/Assets/PrecompAsset.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PrecompAsset.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/9/19. 6 | // 7 | 8 | import Foundation 9 | 10 | final class PrecompAsset: Asset { 11 | 12 | // MARK: Lifecycle 13 | 14 | required init(from decoder: Decoder) throws { 15 | let container = try decoder.container(keyedBy: PrecompAsset.CodingKeys.self) 16 | layers = try container.decode([LayerModel].self, ofFamily: LayerType.self, forKey: .layers) 17 | try super.init(from: decoder) 18 | } 19 | 20 | required init(dictionary: [String: Any]) throws { 21 | let layerDictionaries: [[String: Any]] = try dictionary.value(for: CodingKeys.layers) 22 | layers = try [LayerModel].fromDictionaries(layerDictionaries) 23 | try super.init(dictionary: dictionary) 24 | } 25 | 26 | // MARK: Internal 27 | 28 | enum CodingKeys: String, CodingKey { 29 | case layers 30 | } 31 | 32 | /// Layers of the precomp 33 | let layers: [LayerModel] 34 | 35 | override func encode(to encoder: Encoder) throws { 36 | try super.encode(to: encoder) 37 | var container = encoder.container(keyedBy: CodingKeys.self) 38 | try container.encode(layers, forKey: .layers) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/DictionaryInitializable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DictionaryInitializable.swift 3 | // Lottie 4 | // 5 | // Created by Marcelo Fabri on 5/5/22. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - InitializableError 11 | 12 | enum InitializableError: Error { 13 | case invalidInput 14 | } 15 | 16 | // MARK: - DictionaryInitializable 17 | 18 | protocol DictionaryInitializable { 19 | 20 | init(dictionary: [String: Any]) throws 21 | 22 | } 23 | 24 | // MARK: - AnyInitializable 25 | 26 | protocol AnyInitializable { 27 | 28 | init(value: Any) throws 29 | 30 | } 31 | 32 | extension Dictionary { 33 | 34 | @_disfavoredOverload 35 | func value(for key: KeyType) throws -> T where KeyType.RawValue == Key { 36 | guard let value = self[key.rawValue] as? T else { 37 | throw InitializableError.invalidInput 38 | } 39 | return value 40 | } 41 | 42 | func value(for key: KeyType) throws -> T where KeyType.RawValue == Key { 43 | if let value = self[key.rawValue] as? T { 44 | return value 45 | } 46 | 47 | if let value = self[key.rawValue] { 48 | return try T(value: value) 49 | } 50 | 51 | throw InitializableError.invalidInput 52 | } 53 | 54 | } 55 | 56 | // MARK: - Array + AnyInitializable 57 | 58 | extension Array: AnyInitializable where Element == Double { 59 | 60 | init(value: Any) throws { 61 | guard let array = value as? [Double] else { 62 | throw InitializableError.invalidInput 63 | } 64 | self = array 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/DotLottie/DotLottieAnimation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DotLottieAnimation.swift 3 | // Pods 4 | // 5 | // Created by Evandro Harrison Hoffmann on 28/06/2021. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - DotLottieAnimation 11 | 12 | struct DotLottieAnimation: Codable { 13 | /// Id of Animation 14 | var id: String 15 | 16 | /// Loop enabled 17 | var loop: Bool? = false 18 | 19 | /// Animation Playback Speed 20 | var speed: Double? = 1 21 | 22 | /// 1 or -1 23 | var direction: Int? = 1 24 | 25 | /// mode - "bounce" | "normal" 26 | var mode: DotLottieAnimationMode? = .normal 27 | 28 | /// Loop mode for animation 29 | var loopMode: LottieLoopMode { 30 | switch mode { 31 | case .bounce: 32 | return .autoReverse 33 | case .normal, nil: 34 | return (loop ?? false) ? .loop : .playOnce 35 | } 36 | } 37 | 38 | /// Animation speed 39 | var animationSpeed: Double { 40 | (speed ?? 1) * Double(direction ?? 1) 41 | } 42 | 43 | /// Loads `LottieAnimation` from `animationUrl` 44 | /// - Returns: Deserialized `LottieAnimation`. Optional. 45 | func animation(url: URL) throws -> LottieAnimation { 46 | let animationUrl = url.appendingPathComponent("\(id).json") 47 | let data = try Data(contentsOf: animationUrl) 48 | return try LottieAnimation.from(data: data) 49 | } 50 | } 51 | 52 | // MARK: - DotLottieAnimationMode 53 | 54 | enum DotLottieAnimationMode: String, Codable { 55 | case normal 56 | case bounce 57 | } 58 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/DotLottie/DotLottieManifest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DotLottieManifest.swift 3 | // Lottie 4 | // 5 | // Created by Evandro Harrison Hoffmann on 27/06/2020. 6 | // 7 | 8 | import Foundation 9 | 10 | /// Manifest model for .lottie File 11 | struct DotLottieManifest: Codable { 12 | 13 | var animations: [DotLottieAnimation] 14 | var version: String? 15 | var author: String? 16 | var generator: String? 17 | 18 | /// Decodes data to Manifest model 19 | /// - Parameter data: Data to decode 20 | /// - Throws: Error 21 | /// - Returns: .lottie Manifest model 22 | static func decode(from data: Data) throws -> DotLottieManifest { 23 | try JSONDecoder().decode(DotLottieManifest.self, from: data) 24 | } 25 | 26 | /// Loads manifest from given URL 27 | /// - Parameter path: URL path to Manifest 28 | /// - Returns: Manifest Model 29 | static func load(from url: URL) throws -> DotLottieManifest { 30 | let data = try Data(contentsOf: url) 31 | return try decode(from: data) 32 | } 33 | 34 | /// Encodes to data 35 | /// - Parameter encoder: JSONEncoder 36 | /// - Throws: Error 37 | /// - Returns: encoded Data 38 | func encode(with encoder: JSONEncoder = JSONEncoder()) throws -> Data { 39 | try encoder.encode(self) 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/LayerEffects/DropShadowEffect.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 8/14/23. 2 | // Copyright © 2023 Airbnb Inc. All rights reserved. 3 | 4 | import Foundation 5 | 6 | final class DropShadowEffect: LayerEffect { 7 | 8 | // MARK: Lifecycle 9 | 10 | required init(from decoder: Decoder) throws { 11 | try super.init(from: decoder) 12 | } 13 | 14 | required init(dictionary: [String: Any]) throws { 15 | try super.init(dictionary: dictionary) 16 | } 17 | 18 | // MARK: Internal 19 | 20 | /// The color of the drop shadow 21 | var color: ColorEffectValue? { 22 | value(named: "Shadow Color") 23 | } 24 | 25 | /// Opacity between 0 and 255 26 | var opacity: Vector1DEffectValue? { 27 | value(named: "Opacity") 28 | } 29 | 30 | /// The direction / angle of the drop shadow, in degrees 31 | var direction: Vector1DEffectValue? { 32 | value(named: "Direction") 33 | } 34 | 35 | /// The distance of the drop shadow 36 | var distance: Vector1DEffectValue? { 37 | value(named: "Distance") 38 | } 39 | 40 | /// The softness of the drop shadow 41 | var softness: Vector1DEffectValue? { 42 | value(named: "Softness") 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/LayerEffects/EffectValues/ColorEffectValue.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 8/14/23. 2 | // Copyright © 2023 Airbnb Inc. All rights reserved. 3 | 4 | import Foundation 5 | 6 | final class ColorEffectValue: EffectValue { 7 | 8 | // MARK: Lifecycle 9 | 10 | required init(from decoder: Decoder) throws { 11 | let container = try decoder.container(keyedBy: CodingKeys.self) 12 | value = try? container.decode(KeyframeGroup.self, forKey: .value) 13 | try super.init(from: decoder) 14 | } 15 | 16 | required init(dictionary: [String: Any]) throws { 17 | let valueDictionary: [String: Any] = try dictionary.value(for: CodingKeys.value) 18 | value = try KeyframeGroup(dictionary: valueDictionary) 19 | try super.init(dictionary: dictionary) 20 | } 21 | 22 | // MARK: Internal 23 | 24 | /// The value of the color 25 | let value: KeyframeGroup? 26 | 27 | override func encode(to encoder: Encoder) throws { 28 | try super.encode(to: encoder) 29 | var container = encoder.container(keyedBy: CodingKeys.self) 30 | try container.encode(value, forKey: .value) 31 | } 32 | 33 | // MARK: Private 34 | 35 | private enum CodingKeys: String, CodingKey { 36 | case value = "v" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/LayerEffects/EffectValues/Vector1DEffectValue.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 8/14/23. 2 | // Copyright © 2023 Airbnb Inc. All rights reserved. 3 | 4 | import Foundation 5 | 6 | final class Vector1DEffectValue: EffectValue { 7 | 8 | // MARK: Lifecycle 9 | 10 | required init(from decoder: Decoder) throws { 11 | let container = try decoder.container(keyedBy: CodingKeys.self) 12 | value = try? container.decode(KeyframeGroup.self, forKey: .value) 13 | try super.init(from: decoder) 14 | } 15 | 16 | required init(dictionary: [String: Any]) throws { 17 | let valueDictionary: [String: Any] = try dictionary.value(for: CodingKeys.value) 18 | value = try KeyframeGroup(dictionary: valueDictionary) 19 | try super.init(dictionary: dictionary) 20 | } 21 | 22 | // MARK: Internal 23 | 24 | /// The value of the slider 25 | let value: KeyframeGroup? 26 | 27 | override func encode(to encoder: Encoder) throws { 28 | try super.encode(to: encoder) 29 | var container = encoder.container(keyedBy: CodingKeys.self) 30 | try container.encode(value, forKey: .value) 31 | } 32 | 33 | // MARK: Private 34 | 35 | private enum CodingKeys: String, CodingKey { 36 | case value = "v" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/Layers/ImageLayerModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageLayer.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/8/19. 6 | // 7 | 8 | import Foundation 9 | 10 | /// A layer that holds an image. 11 | final class ImageLayerModel: LayerModel { 12 | 13 | // MARK: Lifecycle 14 | 15 | required init(from decoder: Decoder) throws { 16 | let container = try decoder.container(keyedBy: ImageLayerModel.CodingKeys.self) 17 | referenceID = try container.decode(String.self, forKey: .referenceID) 18 | try super.init(from: decoder) 19 | } 20 | 21 | required init(dictionary: [String: Any]) throws { 22 | referenceID = try dictionary.value(for: CodingKeys.referenceID) 23 | try super.init(dictionary: dictionary) 24 | } 25 | 26 | // MARK: Internal 27 | 28 | /// The reference ID of the image. 29 | let referenceID: String 30 | 31 | override func encode(to encoder: Encoder) throws { 32 | try super.encode(to: encoder) 33 | var container = encoder.container(keyedBy: CodingKeys.self) 34 | try container.encode(referenceID, forKey: .referenceID) 35 | } 36 | 37 | // MARK: Private 38 | 39 | private enum CodingKeys: String, CodingKey { 40 | case referenceID = "refId" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/Layers/ShapeLayerModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShapeLayer.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/8/19. 6 | // 7 | 8 | import Foundation 9 | 10 | /// A layer that holds vector shape objects. 11 | final class ShapeLayerModel: LayerModel { 12 | 13 | // MARK: Lifecycle 14 | 15 | required init(from decoder: Decoder) throws { 16 | let container = try decoder.container(keyedBy: ShapeLayerModel.CodingKeys.self) 17 | items = try container.decode([ShapeItem].self, ofFamily: ShapeType.self, forKey: .items) 18 | try super.init(from: decoder) 19 | } 20 | 21 | required init(dictionary: [String: Any]) throws { 22 | let itemDictionaries: [[String: Any]] = try dictionary.value(for: CodingKeys.items) 23 | items = try [ShapeItem].fromDictionaries(itemDictionaries) 24 | try super.init(dictionary: dictionary) 25 | } 26 | 27 | // MARK: Internal 28 | 29 | /// A list of shape items. 30 | let items: [ShapeItem] 31 | 32 | override func encode(to encoder: Encoder) throws { 33 | try super.encode(to: encoder) 34 | var container = encoder.container(keyedBy: CodingKeys.self) 35 | try container.encode(items, forKey: .items) 36 | } 37 | 38 | // MARK: Private 39 | 40 | private enum CodingKeys: String, CodingKey { 41 | case items = "shapes" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/Objects/DashPattern.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DashPattern.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/22/19. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - DashElementType 11 | 12 | enum DashElementType: String, Codable { 13 | case offset = "o" 14 | case dash = "d" 15 | case gap = "g" 16 | } 17 | 18 | // MARK: - DashElement 19 | 20 | final class DashElement: Codable, DictionaryInitializable { 21 | 22 | // MARK: Lifecycle 23 | 24 | init(dictionary: [String: Any]) throws { 25 | let typeRawValue: String = try dictionary.value(for: CodingKeys.type) 26 | guard let type = DashElementType(rawValue: typeRawValue) else { 27 | throw InitializableError.invalidInput 28 | } 29 | self.type = type 30 | let valueDictionary: [String: Any] = try dictionary.value(for: CodingKeys.value) 31 | value = try KeyframeGroup(dictionary: valueDictionary) 32 | } 33 | 34 | // MARK: Internal 35 | 36 | enum CodingKeys: String, CodingKey { 37 | case type = "n" 38 | case value = "v" 39 | } 40 | 41 | let type: DashElementType 42 | let value: KeyframeGroup 43 | 44 | } 45 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/Objects/Marker.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Marker.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/9/19. 6 | // 7 | 8 | import Foundation 9 | 10 | /// A time marker 11 | final class Marker: Codable, Sendable, DictionaryInitializable { 12 | 13 | // MARK: Lifecycle 14 | 15 | init(dictionary: [String: Any]) throws { 16 | name = try dictionary.value(for: CodingKeys.name) 17 | frameTime = try dictionary.value(for: CodingKeys.frameTime) 18 | durationFrameTime = try dictionary.value(for: CodingKeys.durationFrameTime) 19 | } 20 | 21 | // MARK: Internal 22 | 23 | enum CodingKeys: String, CodingKey { 24 | case name = "cm" 25 | case frameTime = "tm" 26 | case durationFrameTime = "dr" 27 | } 28 | 29 | /// The Marker Name 30 | let name: String 31 | 32 | /// The Frame time of the marker 33 | let frameTime: AnimationFrameTime 34 | 35 | /// The duration of the marker, in frames. 36 | let durationFrameTime: AnimationFrameTime 37 | } 38 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/ShapeItems/Group.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GroupItem.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/8/19. 6 | // 7 | 8 | import Foundation 9 | 10 | /// An item that define a a group of shape items 11 | final class Group: ShapeItem { 12 | 13 | // MARK: Lifecycle 14 | 15 | required init(from decoder: Decoder) throws { 16 | let container = try decoder.container(keyedBy: Group.CodingKeys.self) 17 | items = try container.decode([ShapeItem].self, ofFamily: ShapeType.self, forKey: .items) 18 | try super.init(from: decoder) 19 | } 20 | 21 | required init(dictionary: [String: Any]) throws { 22 | let itemDictionaries: [[String: Any]] = try dictionary.value(for: CodingKeys.items) 23 | items = try [ShapeItem].fromDictionaries(itemDictionaries) 24 | try super.init(dictionary: dictionary) 25 | } 26 | 27 | init(items: [ShapeItem], name: String) { 28 | self.items = items 29 | super.init(name: name, type: .group, hidden: false) 30 | } 31 | 32 | // MARK: Internal 33 | 34 | /// A list of shape items. 35 | let items: [ShapeItem] 36 | 37 | override func encode(to encoder: Encoder) throws { 38 | try super.encode(to: encoder) 39 | var container = encoder.container(keyedBy: CodingKeys.self) 40 | try container.encode(items, forKey: .items) 41 | } 42 | 43 | // MARK: Private 44 | 45 | private enum CodingKeys: String, CodingKey { 46 | case items = "it" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/ShapeItems/Merge.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Merge.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/8/19. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - MergeMode 11 | 12 | enum MergeMode: Int, Codable, Sendable { 13 | case none 14 | case merge 15 | case add 16 | case subtract 17 | case intersect 18 | case exclude 19 | } 20 | 21 | // MARK: - Merge 22 | 23 | final class Merge: ShapeItem { 24 | 25 | // MARK: Lifecycle 26 | 27 | required init(from decoder: Decoder) throws { 28 | let container = try decoder.container(keyedBy: Merge.CodingKeys.self) 29 | mode = try container.decode(MergeMode.self, forKey: .mode) 30 | try super.init(from: decoder) 31 | } 32 | 33 | required init(dictionary: [String: Any]) throws { 34 | let modeRawType: Int = try dictionary.value(for: CodingKeys.mode) 35 | guard let mode = MergeMode(rawValue: modeRawType) else { 36 | throw InitializableError.invalidInput 37 | } 38 | self.mode = mode 39 | try super.init(dictionary: dictionary) 40 | } 41 | 42 | // MARK: Internal 43 | 44 | /// The mode of the merge path 45 | let mode: MergeMode 46 | 47 | override func encode(to encoder: Encoder) throws { 48 | try super.encode(to: encoder) 49 | var container = encoder.container(keyedBy: CodingKeys.self) 50 | try container.encode(mode, forKey: .mode) 51 | } 52 | 53 | // MARK: Private 54 | 55 | private enum CodingKeys: String, CodingKey { 56 | case mode = "mm" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/ShapeItems/RoundedCorners.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RoundedCorners.swift 3 | // Lottie 4 | // 5 | // Created by Duolingo on 10/31/22. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - RoundedCorners 11 | 12 | final class RoundedCorners: ShapeItem { 13 | 14 | // MARK: Lifecycle 15 | 16 | required init(from decoder: Decoder) throws { 17 | let container = try decoder.container(keyedBy: RoundedCorners.CodingKeys.self) 18 | radius = try 19 | container.decode( 20 | KeyframeGroup.self, 21 | forKey: .radius) 22 | try super.init(from: decoder) 23 | } 24 | 25 | required init(dictionary: [String: Any]) throws { 26 | let radiusDictionary: [String: Any] = try dictionary.value(for: CodingKeys.radius) 27 | radius = try KeyframeGroup(dictionary: radiusDictionary) 28 | try super.init(dictionary: dictionary) 29 | } 30 | 31 | // MARK: Internal 32 | 33 | /// The radius of rounded corners 34 | let radius: KeyframeGroup 35 | 36 | override func encode(to encoder: Encoder) throws { 37 | try super.encode(to: encoder) 38 | var container = encoder.container(keyedBy: CodingKeys.self) 39 | try container.encode(radius, forKey: .radius) 40 | } 41 | 42 | // MARK: Private 43 | 44 | private enum CodingKeys: String, CodingKey { 45 | case radius = "r" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Model/Text/Font.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Font.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/9/19. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - Font 11 | 12 | final class Font: Codable, Sendable, DictionaryInitializable { 13 | 14 | // MARK: Lifecycle 15 | 16 | init(dictionary: [String: Any]) throws { 17 | name = try dictionary.value(for: CodingKeys.name) 18 | familyName = try dictionary.value(for: CodingKeys.familyName) 19 | style = try dictionary.value(for: CodingKeys.style) 20 | ascent = try dictionary.value(for: CodingKeys.ascent) 21 | } 22 | 23 | // MARK: Internal 24 | 25 | let name: String 26 | let familyName: String 27 | let style: String 28 | let ascent: Double 29 | 30 | // MARK: Private 31 | 32 | private enum CodingKeys: String, CodingKey { 33 | case name = "fName" 34 | case familyName = "fFamily" 35 | case style = "fStyle" 36 | case ascent 37 | } 38 | 39 | } 40 | 41 | // MARK: - FontList 42 | 43 | /// A list of fonts 44 | final class FontList: Codable, Sendable, DictionaryInitializable { 45 | 46 | // MARK: Lifecycle 47 | 48 | init(dictionary: [String: Any]) throws { 49 | let fontDictionaries: [[String: Any]] = try dictionary.value(for: CodingKeys.fonts) 50 | fonts = try fontDictionaries.map { try Font(dictionary: $0) } 51 | } 52 | 53 | // MARK: Internal 54 | 55 | enum CodingKeys: String, CodingKey { 56 | case fonts = "list" 57 | } 58 | 59 | let fonts: [Font] 60 | 61 | } 62 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Debugging/AnimatorNodeDebugging.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimatorNodeDebugging.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/18/19. 6 | // 7 | 8 | import Foundation 9 | 10 | extension AnimatorNode { 11 | 12 | func printNodeTree() { 13 | parentNode?.printNodeTree() 14 | LottieLogger.shared.info(String(describing: type(of: self))) 15 | 16 | if let group = self as? GroupNode { 17 | LottieLogger.shared.info("* |Children") 18 | group.rootNode?.printNodeTree() 19 | LottieLogger.shared.info("*") 20 | } else { 21 | LottieLogger.shared.info("|") 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Debugging/TestHelpers.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 1/28/22. 2 | // Copyright © 2022 Airbnb Inc. All rights reserved. 3 | 4 | enum TestHelpers { 5 | /// Whether or not snapshot tests are currently running in a test target 6 | static var snapshotTestsAreRunning = false 7 | 8 | /// Whether or not performance tests are currently running in a test target 9 | static var performanceTestsAreRunning = false 10 | } 11 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Extensions/BlendMode+Filter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by Denis Koryttsev on 10.05.2022. 6 | // 7 | 8 | extension BlendMode { 9 | /// The Core Image filter name for this `BlendMode`, that can be applied to a `CALayer`'s `compositingFilter`. 10 | /// Supported compositing filters are defined here: https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/uid/TP30000136-SW71 11 | var filterName: String? { 12 | switch self { 13 | case .normal: return nil 14 | case .multiply: return "multiplyBlendMode" 15 | case .screen: return "screenBlendMode" 16 | case .overlay: return "overlayBlendMode" 17 | case .darken: return "darkenBlendMode" 18 | case .lighten: return "lightenBlendMode" 19 | case .colorDodge: return "colorDodgeBlendMode" 20 | case .colorBurn: return "colorBurnBlendMode" 21 | case .hardLight: return "hardLightBlendMode" 22 | case .softLight: return "softLightBlendMode" 23 | case .difference: return "differenceBlendMode" 24 | case .exclusion: return "exclusionBlendMode" 25 | case .hue: return "hueBlendMode" 26 | case .saturation: return "saturationBlendMode" 27 | case .color: return "colorBlendMode" 28 | case .luminosity: return "luminosityBlendMode" 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Extensions/CGColor+RGB.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 1/7/22. 2 | // Copyright © 2022 Airbnb Inc. All rights reserved. 3 | 4 | import QuartzCore 5 | 6 | extension CGColor { 7 | /// Initializes a `CGColor` using the given `RGB` values 8 | static func rgb(_ red: CGFloat, _ green: CGFloat, _ blue: CGFloat) -> CGColor { 9 | rgba(red, green, blue, 1.0) 10 | } 11 | 12 | /// Initializes a `CGColor` using the given grayscale value 13 | static func gray(_ gray: CGFloat) -> CGColor { 14 | CGColor( 15 | colorSpace: CGColorSpaceCreateDeviceGray(), 16 | components: [gray, 1.0])! 17 | } 18 | 19 | /// Initializes a `CGColor` using the given `RGBA` values 20 | static func rgba(_ red: CGFloat, _ green: CGFloat, _ blue: CGFloat, _ alpha: CGFloat) -> CGColor { 21 | CGColor( 22 | colorSpace: LottieConfiguration.shared.colorSpace, 23 | components: [red, green, blue, alpha])! 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Extensions/DataExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataExtension.swift 3 | // Lottie 4 | // 5 | // Created by René Fouquet on 03.05.21. 6 | // 7 | 8 | import Foundation 9 | #if canImport(UIKit) 10 | import UIKit 11 | #elseif canImport(AppKit) 12 | import AppKit 13 | #endif 14 | 15 | extension Data { 16 | 17 | init(assetName: String, in bundle: Bundle) throws { 18 | #if canImport(UIKit) 19 | if let asset = NSDataAsset(name: assetName, bundle: bundle) { 20 | self = asset.data 21 | return 22 | } else { 23 | throw DotLottieError.assetNotFound(name: assetName, bundle: bundle) 24 | } 25 | #else 26 | if #available(macOS 10.11, *) { 27 | if let asset = NSDataAsset(name: assetName, bundle: bundle) { 28 | self = asset.data 29 | return 30 | } else { 31 | throw DotLottieError.assetNotFound(name: assetName, bundle: bundle) 32 | } 33 | } 34 | throw DotLottieError.loadingFromAssetNotSupported 35 | #endif 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Extensions/StringExtensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringExtensions.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/25/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | 11 | extension String { 12 | 13 | var cgColor: CGColor { 14 | let (red, green, blue) = hexColorComponents() 15 | return .rgb(red, green, blue) 16 | } 17 | 18 | func hexColorComponents() -> (red: CGFloat, green: CGFloat, blue: CGFloat) { 19 | var cString: String = trimmingCharacters(in: .whitespacesAndNewlines).uppercased() 20 | 21 | if cString.hasPrefix("#") { 22 | cString.remove(at: cString.startIndex) 23 | } 24 | 25 | if (cString.count) != 6 { 26 | return (red: 0, green: 0, blue: 0) 27 | } 28 | 29 | var rgbValue: UInt64 = 0 30 | Scanner(string: cString).scanHexInt64(&rgbValue) 31 | 32 | return ( 33 | red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, 34 | green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, 35 | blue: CGFloat(rgbValue & 0x0000FF) / 255.0) 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Helpers/AnyEquatable.swift: -------------------------------------------------------------------------------- 1 | // Created by miguel_jimenez on 8/2/23. 2 | // Copyright © 2023 Airbnb Inc. All rights reserved. 3 | 4 | import Foundation 5 | 6 | // MARK: - AnyEquatable 7 | 8 | struct AnyEquatable { 9 | private let value: Any 10 | private let equals: (Any) -> Bool 11 | 12 | init(_ value: T) { 13 | self.value = value 14 | equals = { $0 as? T == value } 15 | } 16 | } 17 | 18 | // MARK: Equatable 19 | 20 | extension AnyEquatable: Equatable { 21 | static func ==(lhs: AnyEquatable, rhs: AnyEquatable) -> Bool { 22 | lhs.equals(rhs.value) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Helpers/Binding+Map.swift: -------------------------------------------------------------------------------- 1 | // Created by miguel_jimenez on 7/27/23. 2 | // Copyright © 2023 Airbnb Inc. All rights reserved. 3 | 4 | import SwiftUI 5 | 6 | @available(iOS 13.0, tvOS 13.0, macOS 10.15, *) 7 | extension Binding { 8 | 9 | /// Helper to transform a `Binding` from one `Value` type to another. 10 | func map(transform: @escaping (Value) -> Transformed) -> Binding { 11 | .init { 12 | transform(wrappedValue) 13 | } set: { newValue in 14 | guard let newValue = newValue as? Value else { return } 15 | self.wrappedValue = newValue 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Helpers/View+ValueChanged.swift: -------------------------------------------------------------------------------- 1 | // Created by miguel_jimenez on 7/26/23. 2 | // Copyright © 2023 Airbnb Inc. All rights reserved. 3 | 4 | import Combine 5 | import SwiftUI 6 | 7 | @available(iOS 13.0, tvOS 13.0, macOS 10.15, *) 8 | extension View { 9 | /// A backwards compatible wrapper for iOS 14 `onChange` 10 | @ViewBuilder 11 | func valueChanged(value: T, onChange: @escaping (T) -> Void) -> some View { 12 | if #available(iOS 14.0, *, macOS 11.0, tvOS 14.0) { 13 | self.onChange(of: value, perform: onChange) 14 | } else { 15 | onReceive(Just(value)) { value in 16 | onChange(value) 17 | } 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Interpolatable/KeyframeExtensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeyframeExtensions.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 1/14/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | 11 | extension Keyframe where T: AnyInterpolatable { 12 | func interpolate(to: Keyframe, progress: CGFloat) -> T { 13 | value._interpolate( 14 | to: to.value, 15 | amount: progress, 16 | spatialOutTangent: spatialOutTangent?.pointValue, 17 | spatialInTangent: to.spatialInTangent?.pointValue) 18 | } 19 | } 20 | 21 | extension Keyframe { 22 | /// Interpolates the keyTime into a value from 0-1 23 | func interpolatedProgress(_ to: Keyframe, keyTime: CGFloat) -> CGFloat { 24 | let startTime = time 25 | let endTime = to.time 26 | if keyTime <= startTime { 27 | return 0 28 | } 29 | if endTime <= keyTime { 30 | return 1 31 | } 32 | 33 | if isHold { 34 | return 0 35 | } 36 | 37 | let outTanPoint = outTangent?.pointValue ?? .zero 38 | let inTanPoint = to.inTangent?.pointValue ?? CGPoint(x: 1, y: 1) 39 | var progress: CGFloat = keyTime.remap(fromLow: startTime, fromHigh: endTime, toLow: 0, toHigh: 1) 40 | if !outTanPoint.isZero || !inTanPoint.equalTo(CGPoint(x: 1, y: 1)) { 41 | /// Cubic interpolation 42 | progress = progress.cubicBezierInterpolate(.zero, outTanPoint, inTanPoint, CGPoint(x: 1, y: 1)) 43 | } 44 | return progress 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/LottieAnimationSource.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 7/26/23. 2 | // Copyright © 2023 Airbnb Inc. All rights reserved. 3 | 4 | // MARK: - LottieAnimationSource 5 | 6 | /// A data source for a Lottie animation. 7 | /// Either a `LottieAnimation` loaded from a `.json` file, 8 | /// or a `DotLottieFile` loaded from a `.lottie` file. 9 | public enum LottieAnimationSource: Sendable { 10 | /// A `LottieAnimation` loaded from a `.json` file 11 | case lottieAnimation(LottieAnimation) 12 | 13 | /// A `DotLottieFile` loaded from a `.lottie` file 14 | case dotLottieFile(DotLottieFile) 15 | } 16 | 17 | extension LottieAnimationSource { 18 | /// The default animation displayed by this data source 19 | var animation: LottieAnimation? { 20 | switch self { 21 | case .lottieAnimation(let animation): 22 | return animation 23 | case .dotLottieFile(let dotLottieFile): 24 | return dotLottieFile.animation()?.animation 25 | } 26 | } 27 | } 28 | 29 | extension LottieAnimation { 30 | /// This animation represented as a `LottieAnimationSource` 31 | public var animationSource: LottieAnimationSource { 32 | .lottieAnimation(self) 33 | } 34 | } 35 | 36 | extension DotLottieFile { 37 | /// This animation represented as a `LottieAnimationSource` 38 | public var animationSource: LottieAnimationSource { 39 | .dotLottieFile(self) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Private/Utility/Primitives/CGPointExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CGPointExtension.swift 3 | // Lottie 4 | // 5 | // Created by Marcelo Fabri on 5/5/22. 6 | // 7 | 8 | import CoreGraphics 9 | 10 | extension CGPoint: AnyInitializable { 11 | 12 | // MARK: Lifecycle 13 | 14 | init(value: Any) throws { 15 | if let dictionary = value as? [String: CGFloat] { 16 | let x: CGFloat = try dictionary.value(for: CodingKeys.x) 17 | let y: CGFloat = try dictionary.value(for: CodingKeys.y) 18 | self.init(x: x, y: y) 19 | } else if 20 | let array = value as? [CGFloat], 21 | array.count > 1 22 | { 23 | self.init(x: array[0], y: array[1]) 24 | } else { 25 | throw InitializableError.invalidInput 26 | } 27 | } 28 | 29 | // MARK: Private 30 | 31 | private enum CodingKeys: String { 32 | case x 33 | case y 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/AnimationCache/AnimationCacheProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimationCacheProvider.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 2/5/19. 6 | // 7 | 8 | import Foundation 9 | 10 | /// `AnimationCacheProvider` is a protocol that describes an Animation Cache. 11 | /// Animation Cache is used when loading `LottieAnimation` models. Using an Animation Cache 12 | /// can increase performance when loading an animation multiple times. 13 | /// 14 | /// Lottie comes with a prebuilt LRU Animation Cache. 15 | public protocol AnimationCacheProvider: AnyObject, Sendable { 16 | 17 | func animation(forKey: String) -> LottieAnimation? 18 | 19 | func setAnimation(_ animation: LottieAnimation, forKey: String) 20 | 21 | func clearCache() 22 | 23 | } 24 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/AnimationCache/DefaultAnimationCache.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DefaultAnimationCache.swift 3 | // Lottie 4 | // 5 | // Created by Marcelo Fabri on 10/18/22. 6 | // 7 | 8 | import Foundation 9 | 10 | /// A thread-safe Animation Cache that will store animations up to `cacheSize`. 11 | /// 12 | /// Once `cacheSize` is reached, animations can be ejected. 13 | /// The default size of the cache is 100. 14 | /// 15 | /// This cache implementation also responds to memory pressure, as it's backed by `NSCache`. 16 | public class DefaultAnimationCache: AnimationCacheProvider, @unchecked Sendable { 17 | 18 | // MARK: Lifecycle 19 | 20 | public init() { 21 | cache.countLimit = Self.defaultCacheCountLimit 22 | } 23 | 24 | // MARK: Public 25 | 26 | /// The global shared Cache. 27 | public static let sharedCache = DefaultAnimationCache() 28 | 29 | /// The size of the cache. 30 | public var cacheSize: Int { 31 | get { cache.countLimit } 32 | set { cache.countLimit = newValue } 33 | } 34 | 35 | /// Clears the Cache. 36 | public func clearCache() { 37 | cache.removeAllObjects() 38 | } 39 | 40 | public func animation(forKey key: String) -> LottieAnimation? { 41 | cache.object(forKey: key as NSString) 42 | } 43 | 44 | public func setAnimation(_ animation: LottieAnimation, forKey key: String) { 45 | cache.setObject(animation, forKey: key as NSString) 46 | } 47 | 48 | // MARK: Private 49 | 50 | private static let defaultCacheCountLimit = 100 51 | 52 | private let cache = NSCache() 53 | } 54 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/AnimationCache/LRUAnimationCache.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LRUAnimationCache.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 2/5/19. 6 | // 7 | 8 | import Foundation 9 | 10 | @available(*, deprecated, message: """ 11 | Use DefaultAnimationCache instead, which is thread-safe and automatically responds to memory pressure. 12 | """) 13 | public typealias LRUAnimationCache = DefaultAnimationCache 14 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/AnimationCache/LottieAnimationCache.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LottieAnimationCache.swift 3 | // Lottie 4 | // 5 | // Created by Marcelo Fabri on 10/17/22. 6 | // 7 | 8 | /// A customization point to configure which `AnimationCacheProvider` will be used. 9 | public enum LottieAnimationCache { 10 | 11 | /// The animation cache that will be used when loading `LottieAnimation` models. 12 | /// Using an Animation Cache can increase performance when loading an animation multiple times. 13 | /// Defaults to DefaultAnimationCache.sharedCache. 14 | public static var shared: AnimationCacheProvider? = DefaultAnimationCache.sharedCache 15 | } 16 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/Configuration/DecodingStrategy.swift: -------------------------------------------------------------------------------- 1 | // Created by Cal Stephens on 7/14/23. 2 | // Copyright © 2023 Airbnb Inc. All rights reserved. 3 | 4 | /// How animation files should be decoded 5 | public enum DecodingStrategy: Hashable { 6 | /// Use Codable. This is was the default strategy introduced on Lottie 3, but should be rarely 7 | /// used as it's slower than `dictionaryBased`. Kept here for any possible compatibility issues 8 | /// that may come up, but consider it soft-deprecated. 9 | case legacyCodable 10 | 11 | /// Manually deserialize a dictionary into an Animation. 12 | /// This should be at least 2-3x faster than using Codable and due to that 13 | /// it's the default as of Lottie 4.x. 14 | case dictionaryBased 15 | } 16 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/DotLottie/Cache/DotLottieCache.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LRUDotLottieCache.swift 3 | // Lottie 4 | // 5 | // Created by Evandro Hoffmann on 20/10/22. 6 | // 7 | 8 | import Foundation 9 | 10 | /// A DotLottie Cache that will store lottie files up to `cacheSize`. 11 | /// 12 | /// Once `cacheSize` is reached, the least recently used lottie will be ejected. 13 | /// The default size of the cache is 100. 14 | public class DotLottieCache: DotLottieCacheProvider { 15 | 16 | // MARK: Lifecycle 17 | 18 | public init() { 19 | cache.countLimit = Self.defaultCacheCountLimit 20 | } 21 | 22 | // MARK: Public 23 | 24 | /// The global shared Cache. 25 | public static let sharedCache = DotLottieCache() 26 | 27 | /// The size of the cache. 28 | public var cacheSize = defaultCacheCountLimit { 29 | didSet { 30 | cache.countLimit = cacheSize 31 | } 32 | } 33 | 34 | /// Clears the Cache. 35 | public func clearCache() { 36 | cache.removeAllObjects() 37 | } 38 | 39 | public func file(forKey key: String) -> DotLottieFile? { 40 | cache.object(forKey: key as NSString) 41 | } 42 | 43 | public func setFile(_ lottie: DotLottieFile, forKey key: String) { 44 | cache.setObject(lottie, forKey: key as NSString) 45 | } 46 | 47 | // MARK: Private 48 | 49 | private static let defaultCacheCountLimit = 100 50 | 51 | private var cache = NSCache() 52 | 53 | } 54 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/DotLottie/Cache/DotLottieCacheProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DotLottieCacheProvider.swift 3 | // Lottie 4 | // 5 | // Created by Evandro Hoffmann on 20/10/22. 6 | // 7 | 8 | import Foundation 9 | 10 | /// `DotLottieCacheProvider` is a protocol that describes a DotLottie Cache. 11 | /// DotLottie Cache is used when loading `DotLottie` models. Using a DotLottie Cache 12 | /// can increase performance when loading an animation multiple times. 13 | /// 14 | /// Lottie comes with a prebuilt LRU DotLottie Cache. 15 | public protocol DotLottieCacheProvider { 16 | 17 | func file(forKey: String) -> DotLottieFile? 18 | 19 | func setFile(_ lottie: DotLottieFile, forKey: String) 20 | 21 | func clearCache() 22 | 23 | } 24 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/DotLottie/DotLottieConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DotLottieConfiguration.swift 3 | // Lottie 4 | // 5 | // Created by Evandro Hoffmann on 19/10/22. 6 | // 7 | 8 | // MARK: - DotLottieConfiguration 9 | 10 | /// The `DotLottieConfiguration` model holds the presets extracted from DotLottieAnimation 11 | /// The presets are used as input to setup `LottieAnimationView` before playing the animation. 12 | public struct DotLottieConfiguration { 13 | /// id of the animation 14 | public var id: String 15 | 16 | /// Animation Image Provider 17 | public var imageProvider: AnimationImageProvider? 18 | 19 | /// Loop behaviour of animation 20 | public var loopMode: LottieLoopMode 21 | 22 | /// Playback speed of animation 23 | public var speed: Double 24 | } 25 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/FontProvider/AnimationFontProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimationFontProvider.swift 3 | // Lottie 4 | // 5 | // Created by Brandon Withrow on 8/5/20. 6 | // Copyright © 2020 YurtvilleProds. All rights reserved. 7 | // 8 | 9 | import CoreGraphics 10 | import CoreText 11 | import Foundation 12 | 13 | // MARK: - AnimationFontProvider 14 | 15 | /// Font provider is a protocol that is used to supply fonts to `LottieAnimationView`. 16 | /// 17 | public protocol AnimationFontProvider { 18 | func fontFor(family: String, size: CGFloat) -> CTFont? 19 | } 20 | 21 | // MARK: - DefaultFontProvider 22 | 23 | /// Default Font provider. 24 | public final class DefaultFontProvider: AnimationFontProvider { 25 | 26 | // MARK: Lifecycle 27 | 28 | public init() { } 29 | 30 | // MARK: Public 31 | 32 | public func fontFor(family: String, size: CGFloat) -> CTFont? { 33 | CTFontCreateWithName(family as CFString, size, nil) 34 | } 35 | } 36 | 37 | // MARK: Equatable 38 | 39 | extension DefaultFontProvider: Equatable { 40 | public static func ==(_: DefaultFontProvider, _: DefaultFontProvider) -> Bool { 41 | true 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/Primitives/AnimationTime.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimationTime.swift 3 | // lottie-swift-iOS 4 | // 5 | // Created by Brandon Withrow on 2/6/19. 6 | // 7 | 8 | import CoreGraphics 9 | import Foundation 10 | 11 | /// Defines animation time in Frames (Seconds * Framerate). 12 | public typealias AnimationFrameTime = CGFloat 13 | 14 | /// Defines animation time by a progress from 0 (beginning of the animation) to 1 (end of the animation) 15 | public typealias AnimationProgressTime = CGFloat 16 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/Primitives/LottieColor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LottieColor.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 2/4/19. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - ColorFormatDenominator 11 | 12 | public enum ColorFormatDenominator: Hashable { 13 | case One 14 | case OneHundred 15 | case TwoFiftyFive 16 | 17 | var value: Double { 18 | switch self { 19 | case .One: 20 | return 1.0 21 | case .OneHundred: 22 | return 100.0 23 | case .TwoFiftyFive: 24 | return 255.0 25 | } 26 | } 27 | } 28 | 29 | // MARK: - LottieColor 30 | 31 | public struct LottieColor: Hashable { 32 | 33 | public var r: Double 34 | public var g: Double 35 | public var b: Double 36 | public var a: Double 37 | 38 | public init(r: Double, g: Double, b: Double, a: Double, denominator: ColorFormatDenominator = .One) { 39 | self.r = r / denominator.value 40 | self.g = g / denominator.value 41 | self.b = b / denominator.value 42 | self.a = a / denominator.value 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/Primitives/Vectors.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Vectors.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 2/4/19. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - LottieVector1D 11 | 12 | public struct LottieVector1D: Hashable, Sendable { 13 | 14 | public init(_ value: Double) { 15 | self.value = value 16 | } 17 | 18 | public let value: Double 19 | 20 | } 21 | 22 | // MARK: - LottieVector3D 23 | 24 | /// A three dimensional vector. 25 | /// These vectors are encoded and decoded from [Double] 26 | public struct LottieVector3D: Hashable, Sendable { 27 | 28 | public let x: Double 29 | public let y: Double 30 | public let z: Double 31 | 32 | public init(x: Double, y: Double, z: Double) { 33 | self.x = x 34 | self.y = y 35 | self.z = z 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/iOS/AnimationSubview.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnimationSubview.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 2/4/19. 6 | // 7 | 8 | import Foundation 9 | #if canImport(UIKit) 10 | import UIKit 11 | 12 | /// A view that can be added to a keypath of an AnimationView 13 | public final class AnimationSubview: UIView { 14 | 15 | var viewLayer: CALayer? { 16 | layer 17 | } 18 | 19 | } 20 | #endif 21 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CompatibleAnimationKeypath.swift 3 | // Lottie_iOS 4 | // 5 | // Created by Tyler Hedrick on 3/6/19. 6 | // 7 | 8 | import Foundation 9 | #if os(iOS) || os(tvOS) || os(watchOS) || targetEnvironment(macCatalyst) 10 | 11 | /// An Objective-C compatible wrapper around Lottie's AnimationKeypath 12 | @objc 13 | public final class CompatibleAnimationKeypath: NSObject { 14 | 15 | // MARK: Lifecycle 16 | 17 | /// Creates a keypath from a dot separated string. The string is separated by "." 18 | @objc 19 | public init(keypath: String) { 20 | animationKeypath = AnimationKeypath(keypath: keypath) 21 | } 22 | 23 | /// Creates a keypath from a list of strings. 24 | @objc 25 | public init(keys: [String]) { 26 | animationKeypath = AnimationKeypath(keys: keys) 27 | } 28 | 29 | // MARK: Public 30 | 31 | public let animationKeypath: AnimationKeypath 32 | } 33 | #endif 34 | -------------------------------------------------------------------------------- /Example/Pods/lottie-ios/Sources/Public/iOS/UIColorExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColorExtension.swift 3 | // lottie-swift 4 | // 5 | // Created by Brandon Withrow on 2/4/19. 6 | // 7 | 8 | import Foundation 9 | #if os(iOS) || os(tvOS) || os(watchOS) || targetEnvironment(macCatalyst) 10 | import UIKit 11 | 12 | extension UIColor { 13 | 14 | public var lottieColorValue: LottieColor { 15 | var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 16 | getRed(&r, green: &g, blue: &b, alpha: &a) 17 | return LottieColor(r: Double(r), g: Double(g), b: Double(b), a: Double(a)) 18 | } 19 | 20 | } 21 | #endif 22 | -------------------------------------------------------------------------------- /Example/Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Tests/Tests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import JFDynamicLottie 3 | 4 | class Tests: XCTestCase { 5 | 6 | override func setUp() { 7 | super.setUp() 8 | // Put setup code here. This method is called before the invocation of each test method in the class. 9 | } 10 | 11 | override func tearDown() { 12 | // Put teardown code here. This method is called after the invocation of each test method in the class. 13 | super.tearDown() 14 | } 15 | 16 | func testExample() { 17 | // This is an example of a functional test case. 18 | XCTAssert(true, "Pass") 19 | } 20 | 21 | func testPerformanceExample() { 22 | // This is an example of a performance test case. 23 | self.measure() { 24 | // Put the code you want to measure the time of here. 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /JFDynamicLottie/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/JFDynamicLottie/Assets/.gitkeep -------------------------------------------------------------------------------- /JFDynamicLottie/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JerryFans/JFDynamicLottie/bb0cc58f329c9feaca606e3bbb3521b0be29bb7a/JFDynamicLottie/Classes/.gitkeep -------------------------------------------------------------------------------- /JFDynamicLottie/Classes/JFLottieTextProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JFLottieTextProvider.swift 3 | // JFDynamicLottie 4 | // 5 | // Created by JerryFans on 2023/10/25. 6 | // 7 | 8 | import Lottie 9 | import UIKit 10 | 11 | class JFLottieTextProvider: AnimationKeypathTextProvider { 12 | 13 | func text(for keypath: Lottie.AnimationKeypath, sourceText: String) -> String? { 14 | if let replaceText = self.textReplacement[keypath.string] { 15 | return replaceText 16 | } 17 | return sourceText 18 | } 19 | 20 | public var textReplacement: [String : String] = [String : String]() 21 | 22 | public init(textReplacement:[String : String]? = nil) { 23 | if let textReplacement { 24 | self.textReplacement = textReplacement 25 | } 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023 JerryFans 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj --------------------------------------------------------------------------------