lottie-ios 3.2.3 → 3.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/actions/setup/action.yml +32 -0
- package/.github/issue_template.md +6 -23
- package/.github/workflows/main.yml +98 -0
- package/.github/workflows/stale_issues.yml +17 -0
- package/.spi.yml +6 -0
- package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
- package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/Gemfile +4 -0
- package/Gemfile.lock +102 -0
- package/Lottie.xcodeproj/project.pbxproj +2011 -1972
- package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
- package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (macOS).xcscheme } +5 -18
- package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
- package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
- package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
- package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
- package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +34 -0
- package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
- package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +22 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +138 -0
- package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
- package/Package.swift +5 -15
- package/README.md +40 -60
- package/Rakefile +160 -0
- package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
- package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +447 -0
- package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +81 -0
- package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
- package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +55 -0
- package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
- package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
- package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
- package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +58 -0
- package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +257 -0
- package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +124 -0
- package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +73 -0
- package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
- package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
- package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
- package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +497 -0
- package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
- package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
- package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +154 -0
- package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
- package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
- package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +88 -0
- package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +167 -0
- package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
- package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
- package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +64 -0
- package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
- package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
- package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +315 -0
- package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +390 -0
- package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
- package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
- package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
- package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +94 -86
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +59 -43
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
- package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
- package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
- package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +149 -106
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +26 -24
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
- package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +9 -4
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +247 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
- package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +57 -42
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +66 -58
- package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +169 -0
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
- package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
- package/Sources/Private/Model/Animation.swift +160 -0
- package/Sources/Private/Model/Assets/Asset.swift +43 -0
- package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
- package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
- package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
- package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
- package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
- package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
- package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
- package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +222 -0
- package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
- package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
- package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
- package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
- package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
- package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
- package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
- package/Sources/Private/Model/Objects/Marker.swift +33 -0
- package/Sources/Private/Model/Objects/Mask.swift +80 -0
- package/Sources/Private/Model/Objects/Transform.swift +179 -0
- package/Sources/Private/Model/ShapeItems/Ellipse.swift +74 -0
- package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
- package/Sources/Private/Model/ShapeItems/GradientFill.swift +137 -0
- package/Sources/Private/Model/ShapeItems/GradientStroke.swift +185 -0
- package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
- package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -12
- package/Sources/Private/Model/ShapeItems/Rectangle.swift +72 -0
- package/Sources/Private/Model/ShapeItems/Repeater.swift +135 -0
- package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
- package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
- package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +135 -0
- package/Sources/Private/Model/ShapeItems/Star.swift +131 -0
- package/Sources/Private/Model/ShapeItems/Stroke.swift +101 -0
- package/Sources/Private/Model/ShapeItems/Trim.swift +77 -0
- package/Sources/Private/Model/Text/Font.swift +61 -0
- package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
- package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
- package/Sources/Private/Model/Text/TextDocument.swift +123 -0
- package/Sources/Private/RootAnimationLayer.swift +51 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
- package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
- package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
- package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
- package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
- package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
- package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
- package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
- package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
- package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
- package/{lottie-swift/src/Private/NodeRenderSystem/NodeProperties/ValueProviders → Sources/Private/Utility/Interpolatable}/KeyframeInterpolator.swift +125 -108
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
- package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
- package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
- package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
- package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
- package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
- package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
- package/Sources/Public/Animation/AnimationPublic.swift +266 -0
- package/Sources/Public/Animation/AnimationView.swift +1335 -0
- package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
- package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
- package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
- package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
- package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
- package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
- package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
- package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
- package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
- package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
- package/Sources/Public/Keyframes/Keyframe.swift +92 -0
- package/Sources/Public/Logging/LottieLogger.swift +137 -0
- package/Sources/Public/LottieConfiguration.swift +143 -0
- package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
- package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
- package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
- package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
- package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
- package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
- package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
- package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
- package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
- package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
- package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
- package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
- package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
- package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
- package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
- package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
- package/Tests/AnimationKeypathTests.swift +103 -0
- package/Tests/AutomaticEngineTests.swift +57 -0
- package/Tests/BundleTests.swift +25 -0
- package/Tests/DataURLTests.swift +64 -0
- package/Tests/ParsingTests.swift +43 -0
- package/Tests/PerformanceTests.swift +214 -0
- package/Tests/Samples/9squares_AlBoardman.json +1 -0
- package/Tests/Samples/Boat_Loader.json +1 -0
- package/Tests/Samples/HamburgerArrow.json +1 -0
- package/Tests/Samples/IconTransitions.json +1 -0
- package/Tests/Samples/Images/dog.png +0 -0
- package/Tests/Samples/Issues/issue_1125.json +1 -0
- package/Tests/Samples/Issues/issue_1260.json +1 -0
- package/Tests/Samples/Issues/issue_1403.json +1 -0
- package/Tests/Samples/Issues/issue_1407.json +1 -0
- package/Tests/Samples/Issues/issue_1460.json +1 -0
- package/Tests/Samples/Issues/issue_1488.json +1 -0
- package/Tests/Samples/Issues/issue_1505.json +1 -0
- package/Tests/Samples/Issues/issue_1541.json +1 -0
- package/Tests/Samples/Issues/issue_1557.json +1 -0
- package/Tests/Samples/Issues/issue_1603.json +1 -0
- package/Tests/Samples/Issues/issue_1628.json +1 -0
- package/Tests/Samples/Issues/issue_1636.json +1 -0
- package/Tests/Samples/Issues/issue_1643.json +1 -0
- package/Tests/Samples/Issues/issue_1655.json +1 -0
- package/Tests/Samples/Issues/issue_1664.json +1 -0
- package/Tests/Samples/Issues/issue_1683.json +1 -0
- package/Tests/Samples/Issues/issue_1687.json +1 -0
- package/Tests/Samples/Issues/issue_1711.json +1 -0
- package/Tests/Samples/Issues/issue_1717.json +1 -0
- package/Tests/Samples/Issues/issue_769.json +1 -0
- package/Tests/Samples/Issues/issue_885.json +1 -0
- package/Tests/Samples/Issues/issue_965.json +1 -0
- package/Tests/Samples/Issues/pr_1536.json +1 -0
- package/Tests/Samples/Issues/pr_1563.json +8439 -0
- package/Tests/Samples/Issues/pr_1592.json +5527 -0
- package/Tests/Samples/Issues/pr_1599.json +738 -0
- package/Tests/Samples/Issues/pr_1604_1.json +1 -0
- package/Tests/Samples/Issues/pr_1604_2.json +1 -0
- package/Tests/Samples/Issues/pr_1632_1.json +1 -0
- package/Tests/Samples/Issues/pr_1632_2.json +1 -0
- package/Tests/Samples/Issues/pr_1686.json +513 -0
- package/Tests/Samples/Issues/pr_1698.json +1 -0
- package/Tests/Samples/Issues/pr_1699.json +1 -0
- package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
- package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
- package/Tests/Samples/LottieFiles/cactus.json +1 -0
- package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
- package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
- package/Tests/Samples/LottieFiles/fireworks.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
- package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
- package/Tests/Samples/LottieFiles/growth.json +1 -0
- package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
- package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
- package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
- package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
- package/Tests/Samples/LottieFiles/shop.json +1 -0
- package/Tests/Samples/LottieFiles/step_loader.json +1 -0
- package/Tests/Samples/LottieLogo1.json +1 -0
- package/Tests/Samples/LottieLogo1_masked.json +1 -0
- package/Tests/Samples/LottieLogo2.json +1 -0
- package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
- package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
- package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
- package/Tests/Samples/Nonanimating/FirstText.json +1 -0
- package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
- package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
- package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
- package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
- package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
- package/Tests/Samples/Nonanimating/Zoom.json +1 -0
- package/Tests/Samples/Nonanimating/_dog.json +1 -0
- package/Tests/Samples/Nonanimating/base64Test.json +1 -0
- package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
- package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
- package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
- package/Tests/Samples/PinJump.json +1 -0
- package/Tests/Samples/Switch.json +1 -0
- package/Tests/Samples/Switch_States.json +1 -0
- package/Tests/Samples/TwitterHeart.json +1 -0
- package/Tests/Samples/TwitterHeartButton.json +1 -0
- package/Tests/Samples/TypeFace/A.json +1 -0
- package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
- package/Tests/Samples/TypeFace/B.json +1 -0
- package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
- package/Tests/Samples/TypeFace/C.json +1 -0
- package/Tests/Samples/TypeFace/Colon.json +1 -0
- package/Tests/Samples/TypeFace/Comma.json +1 -0
- package/Tests/Samples/TypeFace/D.json +1 -0
- package/Tests/Samples/TypeFace/E.json +1 -0
- package/Tests/Samples/TypeFace/F.json +1 -0
- package/Tests/Samples/TypeFace/G.json +1 -0
- package/Tests/Samples/TypeFace/H.json +1 -0
- package/Tests/Samples/TypeFace/I.json +1 -0
- package/Tests/Samples/TypeFace/J.json +1 -0
- package/Tests/Samples/TypeFace/K.json +1 -0
- package/Tests/Samples/TypeFace/L.json +1 -0
- package/Tests/Samples/TypeFace/M.json +1 -0
- package/Tests/Samples/TypeFace/N.json +1 -0
- package/Tests/Samples/TypeFace/O.json +1 -0
- package/Tests/Samples/TypeFace/P.json +1 -0
- package/Tests/Samples/TypeFace/Q.json +1 -0
- package/Tests/Samples/TypeFace/R.json +1 -0
- package/Tests/Samples/TypeFace/S.json +1 -0
- package/Tests/Samples/TypeFace/T.json +1 -0
- package/Tests/Samples/TypeFace/U.json +1 -0
- package/Tests/Samples/TypeFace/V.json +1 -0
- package/Tests/Samples/TypeFace/W.json +1 -0
- package/Tests/Samples/TypeFace/X.json +1 -0
- package/Tests/Samples/TypeFace/Y.json +1 -0
- package/Tests/Samples/TypeFace/Z.json +1 -0
- package/Tests/Samples/Watermelon.json +1 -0
- package/Tests/Samples/setValueTest.json +1 -0
- package/Tests/Samples/timeremap.json +1 -0
- package/Tests/Samples/vcTransition1.json +1 -0
- package/Tests/Samples/vcTransition2.json +1 -0
- package/Tests/SnapshotConfiguration.swift +158 -0
- package/Tests/SnapshotTests.swift +265 -0
- package/Tests/Utils/Bundle+Module.swift +30 -0
- package/Tests/Utils/HardcodedFontProvider.swift +19 -0
- package/Tests/Utils/HardcodedImageProvider.swift +23 -0
- package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
- package/Tests/ValueProvidersTests.swift +27 -0
- package/lottie-ios.podspec +12 -12
- package/package.json +1 -1
- package/script/test-carthage/Cartfile +1 -0
- package/script/test-carthage/Cartfile.resolved +1 -0
- package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
- package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
- package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
- package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
- package/script/test-carthage/CarthageTest/Info.plist +66 -0
- package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
- package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
- package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
- package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
- package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
- package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
- package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
- package/script/test-carthage/Mintfile +1 -0
- package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
- package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/script/test-spm/Mintfile +1 -0
- package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie/Info.plist +0 -22
- package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
- package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
- package/lottie-swift/Assets/.gitkeep +0 -0
- package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
- package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
- package/lottie-swift/src/Private/Model/Animation.swift +0 -107
- package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
- package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
- package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
- package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
- package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
- package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
- package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
- package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
- package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
- package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
- package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
- package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
- package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
- package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
- package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
- package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
- package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
- package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
- package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
- package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
- package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
- package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
- package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
- package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
- package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
- package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +0 -127
- package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
- package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
- package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
- package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
- package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
- package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
- package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
- package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
- package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
- package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
- package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
- package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
- package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
- package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
- package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
- package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
- package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
- package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
- package/lottie-swift-testing.podspec +0 -32
|
@@ -9,131 +9,156 @@ import Foundation
|
|
|
9
9
|
#if os(iOS) || os(tvOS) || os(watchOS) || targetEnvironment(macCatalyst)
|
|
10
10
|
import UIKit
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
NOTE: Do not initialize directly. This is intended to be subclassed.
|
|
28
|
-
*/
|
|
12
|
+
/// Lottie comes prepacked with a two Animated Controls, `AnimatedSwitch` and
|
|
13
|
+
/// `AnimatedButton`. Both of these controls are built on top of `AnimatedControl`
|
|
14
|
+
///
|
|
15
|
+
/// `AnimatedControl` is a subclass of `UIControl` that provides an interactive
|
|
16
|
+
/// mechanism for controlling the visual state of an animation in response to
|
|
17
|
+
/// user actions.
|
|
18
|
+
///
|
|
19
|
+
/// The `AnimatedControl` will show and hide layers depending on the current
|
|
20
|
+
/// `UIControl.State` of the control.
|
|
21
|
+
///
|
|
22
|
+
/// Users of `AnimationControl` can set a Layer Name for each `UIControl.State`.
|
|
23
|
+
/// When the state is change the `AnimationControl` will change the visibility
|
|
24
|
+
/// of its layers.
|
|
25
|
+
///
|
|
26
|
+
/// NOTE: Do not initialize directly. This is intended to be subclassed.
|
|
29
27
|
open class AnimatedControl: UIControl {
|
|
30
|
-
|
|
31
|
-
// MARK: Public
|
|
32
|
-
|
|
33
|
-
/// The animation view in which the animation is rendered.
|
|
34
|
-
public let animationView: AnimationView
|
|
35
|
-
|
|
36
|
-
/// The animation backing the animated control.
|
|
37
|
-
public var animation: Animation? {
|
|
38
|
-
didSet {
|
|
39
|
-
animationView.animation = animation
|
|
40
|
-
animationView.bounds = animation?.bounds ?? .zero
|
|
41
|
-
setNeedsLayout()
|
|
42
|
-
updateForState()
|
|
43
|
-
animationDidSet()
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
28
|
|
|
47
|
-
|
|
48
|
-
public var animationSpeed: CGFloat {
|
|
49
|
-
set { animationView.animationSpeed = newValue }
|
|
50
|
-
get { return animationView.animationSpeed }
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/// Sets which Animation Layer should be visible for the given state.
|
|
54
|
-
public func setLayer(named: String, forState: UIControl.State) {
|
|
55
|
-
stateMap[forState.rawValue] = named
|
|
56
|
-
updateForState()
|
|
57
|
-
}
|
|
29
|
+
// MARK: Lifecycle
|
|
58
30
|
|
|
59
|
-
/// Sets a ValueProvider for the specified keypath
|
|
60
|
-
public func setValueProvider(_ valueProvider: AnyValueProvider, keypath: AnimationKeypath) {
|
|
61
|
-
animationView.setValueProvider(valueProvider, keypath: keypath)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
31
|
// MARK: Initializers
|
|
65
|
-
|
|
66
|
-
public init(
|
|
67
|
-
|
|
32
|
+
|
|
33
|
+
public init(
|
|
34
|
+
animation: Animation,
|
|
35
|
+
configuration: LottieConfiguration = .shared)
|
|
36
|
+
{
|
|
37
|
+
animationView = AnimationView(
|
|
38
|
+
animation: animation,
|
|
39
|
+
configuration: configuration)
|
|
40
|
+
|
|
68
41
|
super.init(frame: animation.bounds)
|
|
69
42
|
commonInit()
|
|
70
43
|
}
|
|
71
|
-
|
|
44
|
+
|
|
72
45
|
public init() {
|
|
73
|
-
|
|
46
|
+
animationView = AnimationView()
|
|
74
47
|
super.init(frame: .zero)
|
|
75
48
|
commonInit()
|
|
76
49
|
}
|
|
77
|
-
|
|
50
|
+
|
|
78
51
|
required public init?(coder aDecoder: NSCoder) {
|
|
79
|
-
|
|
52
|
+
animationView = AnimationView()
|
|
80
53
|
super.init(coder: aDecoder)
|
|
81
54
|
commonInit()
|
|
82
55
|
}
|
|
83
|
-
|
|
56
|
+
|
|
57
|
+
// MARK: Open
|
|
58
|
+
|
|
84
59
|
// MARK: UIControl Overrides
|
|
85
|
-
|
|
60
|
+
|
|
86
61
|
open override var isEnabled: Bool {
|
|
87
62
|
didSet {
|
|
88
63
|
updateForState()
|
|
89
64
|
}
|
|
90
65
|
}
|
|
91
|
-
|
|
66
|
+
|
|
92
67
|
open override var isSelected: Bool {
|
|
93
68
|
didSet {
|
|
94
69
|
updateForState()
|
|
95
70
|
}
|
|
96
71
|
}
|
|
97
|
-
|
|
72
|
+
|
|
98
73
|
open override var isHighlighted: Bool {
|
|
99
74
|
didSet {
|
|
100
75
|
updateForState()
|
|
101
76
|
}
|
|
102
77
|
}
|
|
103
|
-
|
|
78
|
+
|
|
79
|
+
open override var intrinsicContentSize: CGSize {
|
|
80
|
+
animationView.intrinsicContentSize
|
|
81
|
+
}
|
|
82
|
+
|
|
104
83
|
open override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
|
|
105
84
|
updateForState()
|
|
106
85
|
return super.beginTracking(touch, with: event)
|
|
107
86
|
}
|
|
108
|
-
|
|
87
|
+
|
|
109
88
|
open override func continueTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
|
|
110
89
|
updateForState()
|
|
111
90
|
return super.continueTracking(touch, with: event)
|
|
112
91
|
}
|
|
113
|
-
|
|
92
|
+
|
|
114
93
|
open override func endTracking(_ touch: UITouch?, with event: UIEvent?) {
|
|
115
94
|
updateForState()
|
|
116
95
|
return super.endTracking(touch, with: event)
|
|
117
96
|
}
|
|
118
|
-
|
|
97
|
+
|
|
119
98
|
open override func cancelTracking(with event: UIEvent?) {
|
|
120
99
|
updateForState()
|
|
121
100
|
super.cancelTracking(with: event)
|
|
122
101
|
}
|
|
123
|
-
|
|
124
|
-
open
|
|
125
|
-
|
|
102
|
+
|
|
103
|
+
open func animationDidSet() { }
|
|
104
|
+
|
|
105
|
+
// MARK: Public
|
|
106
|
+
|
|
107
|
+
/// The animation view in which the animation is rendered.
|
|
108
|
+
public let animationView: AnimationView
|
|
109
|
+
|
|
110
|
+
/// The animation backing the animated control.
|
|
111
|
+
public var animation: Animation? {
|
|
112
|
+
didSet {
|
|
113
|
+
animationView.animation = animation
|
|
114
|
+
animationView.bounds = animation?.bounds ?? .zero
|
|
115
|
+
setNeedsLayout()
|
|
116
|
+
updateForState()
|
|
117
|
+
animationDidSet()
|
|
118
|
+
}
|
|
126
119
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
120
|
+
|
|
121
|
+
/// The speed of the animation playback. Defaults to 1
|
|
122
|
+
public var animationSpeed: CGFloat {
|
|
123
|
+
set { animationView.animationSpeed = newValue }
|
|
124
|
+
get { animationView.animationSpeed }
|
|
130
125
|
}
|
|
131
|
-
|
|
126
|
+
|
|
127
|
+
/// Sets which Animation Layer should be visible for the given state.
|
|
128
|
+
public func setLayer(named: String, forState: UIControl.State) {
|
|
129
|
+
stateMap[forState.rawValue] = named
|
|
130
|
+
updateForState()
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/// Sets a ValueProvider for the specified keypath
|
|
134
|
+
public func setValueProvider(_ valueProvider: AnyValueProvider, keypath: AnimationKeypath) {
|
|
135
|
+
animationView.setValueProvider(valueProvider, keypath: keypath)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// MARK: Internal
|
|
139
|
+
|
|
140
|
+
var stateMap: [UInt: String] = [:]
|
|
141
|
+
|
|
142
|
+
func updateForState() {
|
|
143
|
+
guard let animationLayer = animationView.animationLayer else { return }
|
|
144
|
+
if
|
|
145
|
+
let layerName = stateMap[state.rawValue],
|
|
146
|
+
let stateLayer = animationLayer.layer(for: AnimationKeypath(keypath: layerName))
|
|
147
|
+
{
|
|
148
|
+
for layer in animationLayer._animationLayers {
|
|
149
|
+
layer.isHidden = true
|
|
150
|
+
}
|
|
151
|
+
stateLayer.isHidden = false
|
|
152
|
+
} else {
|
|
153
|
+
for layer in animationLayer._animationLayers {
|
|
154
|
+
layer.isHidden = false
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
132
159
|
// MARK: Private
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
fileprivate func commonInit() {
|
|
160
|
+
|
|
161
|
+
private func commonInit() {
|
|
137
162
|
animationView.clipsToBounds = false
|
|
138
163
|
clipsToBounds = true
|
|
139
164
|
animationView.translatesAutoresizingMaskIntoConstraints = false
|
|
@@ -146,21 +171,5 @@ open class AnimatedControl: UIControl {
|
|
|
146
171
|
animationView.topAnchor.constraint(equalTo: topAnchor).isActive = true
|
|
147
172
|
animationView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
|
|
148
173
|
}
|
|
149
|
-
|
|
150
|
-
func updateForState() {
|
|
151
|
-
guard let animationLayer = animationView.animationLayer else { return }
|
|
152
|
-
if let layerName = stateMap[state.rawValue],
|
|
153
|
-
let stateLayer = animationLayer.layer(for: AnimationKeypath(keypath: layerName)) {
|
|
154
|
-
for layer in animationLayer.animationLayers {
|
|
155
|
-
layer.isHidden = true
|
|
156
|
-
}
|
|
157
|
-
stateLayer.isHidden = false
|
|
158
|
-
} else {
|
|
159
|
-
for layer in animationLayer.animationLayers {
|
|
160
|
-
layer.isHidden = false
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
174
|
}
|
|
166
175
|
#endif
|
|
@@ -9,21 +9,81 @@ import Foundation
|
|
|
9
9
|
#if os(iOS) || os(tvOS) || os(watchOS) || targetEnvironment(macCatalyst)
|
|
10
10
|
import UIKit
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
/// An interactive switch with an 'On' and 'Off' state. When the user taps on the
|
|
13
|
+
/// switch the state is toggled and the appropriate animation is played.
|
|
14
|
+
///
|
|
15
|
+
/// Both the 'On' and 'Off' have an animation play range associated with their state.
|
|
16
|
+
open class AnimatedSwitch: AnimatedControl {
|
|
17
|
+
|
|
18
|
+
// MARK: Lifecycle
|
|
19
|
+
|
|
20
|
+
public override init(
|
|
21
|
+
animation: Animation,
|
|
22
|
+
configuration: LottieConfiguration = .shared)
|
|
23
|
+
{
|
|
24
|
+
/// Generate a haptic generator if available.
|
|
25
|
+
#if os(iOS)
|
|
26
|
+
if #available(iOS 10.0, *) {
|
|
27
|
+
self.hapticGenerator = HapticGenerator()
|
|
28
|
+
} else {
|
|
29
|
+
hapticGenerator = NullHapticGenerator()
|
|
30
|
+
}
|
|
31
|
+
#else
|
|
32
|
+
hapticGenerator = NullHapticGenerator()
|
|
33
|
+
#endif
|
|
34
|
+
super.init(animation: animation, configuration: configuration)
|
|
35
|
+
isAccessibilityElement = true
|
|
36
|
+
updateOnState(isOn: _isOn, animated: false, shouldFireHaptics: false)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public override init() {
|
|
40
|
+
/// Generate a haptic generator if available.
|
|
41
|
+
#if os(iOS)
|
|
42
|
+
if #available(iOS 10.0, *) {
|
|
43
|
+
self.hapticGenerator = HapticGenerator()
|
|
44
|
+
} else {
|
|
45
|
+
hapticGenerator = NullHapticGenerator()
|
|
46
|
+
}
|
|
47
|
+
#else
|
|
48
|
+
hapticGenerator = NullHapticGenerator()
|
|
49
|
+
#endif
|
|
50
|
+
super.init()
|
|
51
|
+
isAccessibilityElement = true
|
|
52
|
+
updateOnState(isOn: _isOn, animated: false, shouldFireHaptics: false)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
required public init?(coder aDecoder: NSCoder) {
|
|
56
|
+
/// Generate a haptic generator if available.
|
|
57
|
+
#if os(iOS)
|
|
58
|
+
if #available(iOS 10.0, *) {
|
|
59
|
+
self.hapticGenerator = HapticGenerator()
|
|
60
|
+
} else {
|
|
61
|
+
hapticGenerator = NullHapticGenerator()
|
|
62
|
+
}
|
|
63
|
+
#else
|
|
64
|
+
hapticGenerator = NullHapticGenerator()
|
|
65
|
+
#endif
|
|
66
|
+
super.init(coder: aDecoder)
|
|
67
|
+
isAccessibilityElement = true
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// MARK: Public
|
|
19
71
|
|
|
20
72
|
/// Defines what happens when the user taps the switch while an
|
|
21
73
|
/// animation is still in flight
|
|
22
74
|
public enum CancelBehavior {
|
|
23
75
|
case reverse // default - plays the current animation in reverse
|
|
24
|
-
case none
|
|
76
|
+
case none // does not update the animation when canceled
|
|
25
77
|
}
|
|
26
|
-
|
|
78
|
+
|
|
79
|
+
/// The cancel behavior for the switch. See CancelBehavior for options
|
|
80
|
+
public var cancelBehavior: CancelBehavior = .reverse
|
|
81
|
+
|
|
82
|
+
public override var accessibilityTraits: UIAccessibilityTraits {
|
|
83
|
+
set { super.accessibilityTraits = newValue }
|
|
84
|
+
get { super.accessibilityTraits.union(.button) }
|
|
85
|
+
}
|
|
86
|
+
|
|
27
87
|
/// The current state of the switch.
|
|
28
88
|
public var isOn: Bool {
|
|
29
89
|
set {
|
|
@@ -32,13 +92,10 @@ final public class AnimatedSwitch: AnimatedControl {
|
|
|
32
92
|
updateOnState(isOn: newValue, animated: false, shouldFireHaptics: false)
|
|
33
93
|
}
|
|
34
94
|
get {
|
|
35
|
-
|
|
95
|
+
_isOn
|
|
36
96
|
}
|
|
37
97
|
}
|
|
38
98
|
|
|
39
|
-
/// The cancel behavior for the switch. See CancelBehavior for options
|
|
40
|
-
public var cancelBehavior: CancelBehavior = .reverse
|
|
41
|
-
|
|
42
99
|
/// Set the state of the switch and specify animation and haptics
|
|
43
100
|
public func setIsOn(_ isOn: Bool, animated: Bool, shouldFireHaptics: Bool = true) {
|
|
44
101
|
guard isOn != _isOn else { return }
|
|
@@ -46,9 +103,11 @@ final public class AnimatedSwitch: AnimatedControl {
|
|
|
46
103
|
}
|
|
47
104
|
|
|
48
105
|
/// Sets the play range for the given state. When the switch is toggled, the animation range is played.
|
|
49
|
-
public func setProgressForState(
|
|
50
|
-
|
|
51
|
-
|
|
106
|
+
public func setProgressForState(
|
|
107
|
+
fromProgress: AnimationProgressTime,
|
|
108
|
+
toProgress: AnimationProgressTime,
|
|
109
|
+
forOnState: Bool)
|
|
110
|
+
{
|
|
52
111
|
if forOnState {
|
|
53
112
|
onStartProgress = fromProgress
|
|
54
113
|
onEndProgress = toProgress
|
|
@@ -56,64 +115,22 @@ final public class AnimatedSwitch: AnimatedControl {
|
|
|
56
115
|
offStartProgress = fromProgress
|
|
57
116
|
offEndProgress = toProgress
|
|
58
117
|
}
|
|
59
|
-
|
|
60
|
-
updateOnState(isOn: _isOn, animated: false, shouldFireHaptics: false)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
public override init(animation: Animation) {
|
|
64
|
-
/// Generate a haptic generator if available.
|
|
65
|
-
#if os(iOS)
|
|
66
|
-
if #available(iOS 10.0, *) {
|
|
67
|
-
self.hapticGenerator = HapticGenerator()
|
|
68
|
-
} else {
|
|
69
|
-
self.hapticGenerator = NullHapticGenerator()
|
|
70
|
-
}
|
|
71
|
-
#else
|
|
72
|
-
self.hapticGenerator = NullHapticGenerator()
|
|
73
|
-
#endif
|
|
74
|
-
super.init(animation: animation)
|
|
118
|
+
|
|
75
119
|
updateOnState(isOn: _isOn, animated: false, shouldFireHaptics: false)
|
|
76
|
-
self.accessibilityTraits = UIAccessibilityTraits.button
|
|
77
120
|
}
|
|
78
|
-
|
|
79
|
-
public override
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
self.hapticGenerator = HapticGenerator()
|
|
84
|
-
} else {
|
|
85
|
-
self.hapticGenerator = NullHapticGenerator()
|
|
86
|
-
}
|
|
87
|
-
#else
|
|
88
|
-
self.hapticGenerator = NullHapticGenerator()
|
|
89
|
-
#endif
|
|
90
|
-
super.init()
|
|
91
|
-
updateOnState(isOn: _isOn, animated: false, shouldFireHaptics: false)
|
|
92
|
-
self.accessibilityTraits = UIAccessibilityTraits.button
|
|
121
|
+
|
|
122
|
+
public override func endTracking(_ touch: UITouch?, with event: UIEvent?) {
|
|
123
|
+
super.endTracking(touch, with: event)
|
|
124
|
+
updateOnState(isOn: !_isOn, animated: true, shouldFireHaptics: true)
|
|
125
|
+
sendActions(for: .valueChanged)
|
|
93
126
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
#if os(iOS)
|
|
98
|
-
if #available(iOS 10.0, *) {
|
|
99
|
-
self.hapticGenerator = HapticGenerator()
|
|
100
|
-
} else {
|
|
101
|
-
self.hapticGenerator = NullHapticGenerator()
|
|
102
|
-
}
|
|
103
|
-
#else
|
|
104
|
-
self.hapticGenerator = NullHapticGenerator()
|
|
105
|
-
#endif
|
|
106
|
-
super.init(coder: aDecoder)
|
|
107
|
-
self.accessibilityTraits = UIAccessibilityTraits.button
|
|
127
|
+
|
|
128
|
+
public override func animationDidSet() {
|
|
129
|
+
updateOnState(isOn: _isOn, animated: true, shouldFireHaptics: false)
|
|
108
130
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
fileprivate var offStartProgress: CGFloat = 1
|
|
113
|
-
fileprivate var offEndProgress: CGFloat = 0
|
|
114
|
-
fileprivate var _isOn: Bool = false
|
|
115
|
-
fileprivate var hapticGenerator: ImpactGenerator
|
|
116
|
-
|
|
131
|
+
|
|
132
|
+
// MARK: Internal
|
|
133
|
+
|
|
117
134
|
// MARK: Animation State
|
|
118
135
|
|
|
119
136
|
func updateOnState(isOn: Bool, animated: Bool, shouldFireHaptics: Bool) {
|
|
@@ -127,8 +144,11 @@ final public class AnimatedSwitch: AnimatedControl {
|
|
|
127
144
|
|
|
128
145
|
let previousStateStart = isOn ? offStartProgress : onStartProgress
|
|
129
146
|
let previousStateEnd = isOn ? offEndProgress : onEndProgress
|
|
130
|
-
if
|
|
131
|
-
|
|
147
|
+
if
|
|
148
|
+
realtimeProgress.isInRange(
|
|
149
|
+
min(previousStateStart, previousStateEnd),
|
|
150
|
+
max(previousStateStart, previousStateEnd))
|
|
151
|
+
{
|
|
132
152
|
/// Animation is currently in the previous time range. Reverse the previous play.
|
|
133
153
|
startProgress = previousStateEnd
|
|
134
154
|
endProgress = previousStateStart
|
|
@@ -136,59 +156,73 @@ final public class AnimatedSwitch: AnimatedControl {
|
|
|
136
156
|
}
|
|
137
157
|
|
|
138
158
|
updateAccessibilityLabel()
|
|
139
|
-
|
|
159
|
+
|
|
140
160
|
guard animated == true else {
|
|
141
161
|
animationView.currentProgress = finalProgress
|
|
142
162
|
return
|
|
143
163
|
}
|
|
144
164
|
|
|
145
165
|
if shouldFireHaptics {
|
|
146
|
-
|
|
166
|
+
hapticGenerator.generateImpact()
|
|
147
167
|
}
|
|
148
168
|
|
|
149
|
-
animationView.play(
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
public override func animationDidSet() {
|
|
163
|
-
updateOnState(isOn: _isOn, animated: true, shouldFireHaptics: false)
|
|
169
|
+
animationView.play(
|
|
170
|
+
fromProgress: startProgress,
|
|
171
|
+
toProgress: endProgress,
|
|
172
|
+
loopMode: LottieLoopMode.playOnce,
|
|
173
|
+
completion: { [weak self] finished in
|
|
174
|
+
guard let self = self else { return }
|
|
175
|
+
|
|
176
|
+
// For the Main Thread rendering engine, we freeze the animation at the expected final progress
|
|
177
|
+
// once the animation is complete. This isn't necessary on the Core Animation engine.
|
|
178
|
+
if finished, !(self.animationView.animationLayer is CoreAnimationLayer) {
|
|
179
|
+
self.animationView.currentProgress = finalProgress
|
|
180
|
+
}
|
|
181
|
+
})
|
|
164
182
|
}
|
|
165
183
|
|
|
184
|
+
// MARK: Fileprivate
|
|
185
|
+
|
|
186
|
+
fileprivate var onStartProgress: CGFloat = 0
|
|
187
|
+
fileprivate var onEndProgress: CGFloat = 1
|
|
188
|
+
fileprivate var offStartProgress: CGFloat = 1
|
|
189
|
+
fileprivate var offEndProgress: CGFloat = 0
|
|
190
|
+
fileprivate var _isOn = false
|
|
191
|
+
fileprivate var hapticGenerator: ImpactGenerator
|
|
192
|
+
|
|
166
193
|
// MARK: Private
|
|
167
194
|
|
|
168
195
|
private func updateAccessibilityLabel() {
|
|
169
196
|
accessibilityValue = _isOn ? NSLocalizedString("On", comment: "On") : NSLocalizedString("Off", comment: "Off")
|
|
170
197
|
}
|
|
171
|
-
|
|
198
|
+
|
|
172
199
|
}
|
|
173
200
|
#endif
|
|
174
201
|
|
|
202
|
+
// MARK: - ImpactGenerator
|
|
203
|
+
|
|
175
204
|
protocol ImpactGenerator {
|
|
176
205
|
func generateImpact()
|
|
177
206
|
}
|
|
178
207
|
|
|
208
|
+
// MARK: - NullHapticGenerator
|
|
209
|
+
|
|
179
210
|
class NullHapticGenerator: ImpactGenerator {
|
|
180
|
-
func generateImpact() {
|
|
181
|
-
|
|
182
|
-
}
|
|
211
|
+
func generateImpact() { }
|
|
183
212
|
}
|
|
184
213
|
|
|
185
214
|
#if os(iOS)
|
|
186
215
|
@available(iOS 10.0, *)
|
|
187
216
|
class HapticGenerator: ImpactGenerator {
|
|
217
|
+
|
|
218
|
+
// MARK: Internal
|
|
219
|
+
|
|
188
220
|
func generateImpact() {
|
|
189
221
|
impact.impactOccurred()
|
|
190
222
|
}
|
|
191
|
-
|
|
223
|
+
|
|
224
|
+
// MARK: Fileprivate
|
|
225
|
+
|
|
192
226
|
fileprivate let impact = UIImpactFeedbackGenerator(style: .light)
|
|
193
227
|
}
|
|
194
228
|
#endif
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
//
|
|
2
|
+
// AnimationViewBase.swift
|
|
3
|
+
// lottie-swift-iOS
|
|
4
|
+
//
|
|
5
|
+
// Created by Brandon Withrow on 2/6/19.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#if os(iOS) || os(tvOS) || os(watchOS) || targetEnvironment(macCatalyst)
|
|
9
|
+
import UIKit
|
|
10
|
+
|
|
11
|
+
/// The base view for `AnimationView` on iOS, tvOS, watchOS, and macCatalyst.
|
|
12
|
+
///
|
|
13
|
+
/// Enables the `AnimationView` implementation to be shared across platforms.
|
|
14
|
+
public class AnimationViewBase: UIView {
|
|
15
|
+
|
|
16
|
+
// MARK: Public
|
|
17
|
+
|
|
18
|
+
public override var contentMode: UIView.ContentMode {
|
|
19
|
+
didSet {
|
|
20
|
+
setNeedsLayout()
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public override func didMoveToWindow() {
|
|
25
|
+
super.didMoveToWindow()
|
|
26
|
+
animationMovedToWindow()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public override func layoutSubviews() {
|
|
30
|
+
super.layoutSubviews()
|
|
31
|
+
layoutAnimation()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// MARK: Internal
|
|
35
|
+
|
|
36
|
+
var viewLayer: CALayer? {
|
|
37
|
+
layer
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
var screenScale: CGFloat {
|
|
41
|
+
UIScreen.main.scale
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
func layoutAnimation() {
|
|
45
|
+
// Implemented by subclasses.
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func animationMovedToWindow() {
|
|
49
|
+
// Implemented by subclasses.
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func commonInit() {
|
|
53
|
+
contentMode = .scaleAspectFit
|
|
54
|
+
clipsToBounds = true
|
|
55
|
+
NotificationCenter.default.addObserver(
|
|
56
|
+
self,
|
|
57
|
+
selector: #selector(animationWillEnterForeground),
|
|
58
|
+
name: UIApplication.willEnterForegroundNotification,
|
|
59
|
+
object: nil)
|
|
60
|
+
NotificationCenter.default.addObserver(
|
|
61
|
+
self,
|
|
62
|
+
selector: #selector(animationWillMoveToBackground),
|
|
63
|
+
name: UIApplication.didEnterBackgroundNotification,
|
|
64
|
+
object: nil)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@objc
|
|
68
|
+
func animationWillMoveToBackground() {
|
|
69
|
+
// Implemented by subclasses.
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@objc
|
|
73
|
+
func animationWillEnterForeground() {
|
|
74
|
+
// Implemented by subclasses.
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
#endif
|