├── .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
--------------------------------------------------------------------------------