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.
Files changed (434) hide show
  1. package/.github/actions/setup/action.yml +32 -0
  2. package/.github/issue_template.md +6 -23
  3. package/.github/workflows/main.yml +98 -0
  4. package/.github/workflows/stale_issues.yml +17 -0
  5. package/.spi.yml +6 -0
  6. package/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +7 -0
  7. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  8. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  9. package/.swiftpm/xcode/xcuserdata/{brandonwithrow.xcuserdatad → cal.xcuserdatad}/xcschemes/xcschememanagement.plist +25 -15
  10. package/.swiftpm/xcode/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  11. package/Gemfile +4 -0
  12. package/Gemfile.lock +102 -0
  13. package/Lottie.xcodeproj/project.pbxproj +2011 -1972
  14. package/Lottie.xcodeproj/project.xcworkspace/contents.xcworkspacedata +1 -1
  15. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  16. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_iOS.xcscheme → Lottie (iOS).xcscheme } +15 -18
  17. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_tvOS.xcscheme → Lottie (macOS).xcscheme } +5 -18
  18. package/Lottie.xcodeproj/xcshareddata/xcschemes/{Lottie_macOS.xcscheme → Lottie (tvOS).xcscheme } +5 -18
  19. package/Lottie.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +37 -0
  20. package/Lottie.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +24 -0
  21. package/Lottie.xcworkspace/contents.xcworkspacedata +10 -0
  22. package/Lottie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  23. package/Lottie.xcworkspace/xcshareddata/swiftpm/Package.resolved +34 -0
  24. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  25. package/{Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad → Lottie.xcworkspace/xcuserdata/cal.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist +2 -2
  26. package/Lottie.xcworkspace/xcuserdata/cal.xcuserdatad/xcdebugger/Expressions.xcexplist +153 -0
  27. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  28. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +22 -0
  29. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcdebugger/Expressions.xcexplist +138 -0
  30. package/Lottie.xcworkspace/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +30 -0
  31. package/Package.swift +5 -15
  32. package/README.md +40 -60
  33. package/Rakefile +160 -0
  34. package/Sources/Private/CoreAnimation/Animations/CAAnimation+TimingConfiguration.swift +81 -0
  35. package/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +447 -0
  36. package/Sources/Private/CoreAnimation/Animations/CombinedShapeAnimation.swift +81 -0
  37. package/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +41 -0
  38. package/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +55 -0
  39. package/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +210 -0
  40. package/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +229 -0
  41. package/Sources/Private/CoreAnimation/Animations/OpacityAnimation.swift +52 -0
  42. package/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +58 -0
  43. package/Sources/Private/CoreAnimation/Animations/ShapeAnimation.swift +257 -0
  44. package/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +124 -0
  45. package/Sources/Private/CoreAnimation/Animations/StrokeAnimation.swift +73 -0
  46. package/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +205 -0
  47. package/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +37 -0
  48. package/Sources/Private/CoreAnimation/CompatibilityTracker.swift +130 -0
  49. package/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +497 -0
  50. package/Sources/Private/CoreAnimation/Extensions/CALayer+fillBounds.swift +35 -0
  51. package/Sources/Private/CoreAnimation/Extensions/KeyframeGroup+exactlyOneKeyframe.swift +37 -0
  52. package/Sources/Private/CoreAnimation/Extensions/Keyframes+combinedIfPossible.swift +154 -0
  53. package/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +83 -0
  54. package/Sources/Private/CoreAnimation/Layers/BaseAnimationLayer.swift +33 -0
  55. package/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +88 -0
  56. package/Sources/Private/CoreAnimation/Layers/CALayer+setupLayerHierarchy.swift +167 -0
  57. package/Sources/Private/CoreAnimation/Layers/GradientRenderLayer.swift +94 -0
  58. package/Sources/Private/CoreAnimation/Layers/ImageLayer.swift +79 -0
  59. package/Sources/Private/CoreAnimation/Layers/LayerModel+makeAnimationLayer.swift +64 -0
  60. package/Sources/Private/CoreAnimation/Layers/MaskCompositionLayer.swift +138 -0
  61. package/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +140 -0
  62. package/Sources/Private/CoreAnimation/Layers/RepeaterLayer.swift +85 -0
  63. package/Sources/Private/CoreAnimation/Layers/ShapeItemLayer.swift +315 -0
  64. package/Sources/Private/CoreAnimation/Layers/ShapeLayer.swift +390 -0
  65. package/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +47 -0
  66. package/Sources/Private/CoreAnimation/Layers/TextLayer.swift +91 -0
  67. package/Sources/Private/CoreAnimation/Layers/TransformLayer.swift +11 -0
  68. package/Sources/Private/CoreAnimation/ValueProviderStore.swift +139 -0
  69. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/CompositionLayer.swift +94 -86
  70. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ImageCompositionLayer.swift +24 -21
  71. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/MaskContainerLayer.swift +75 -54
  72. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/NullCompositionLayer.swift +5 -5
  73. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/PreCompositionLayer.swift +59 -43
  74. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/ShapeCompositionLayer.swift +22 -20
  75. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/SolidCompositionLayer.swift +26 -17
  76. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/CompLayers/TextCompositionLayer.swift +42 -36
  77. package/{lottie-swift/src/Private/LayerContainers/AnimationContainer.swift → Sources/Private/MainThread/LayerContainers/MainThreadAnimationLayer.swift} +200 -140
  78. package/Sources/Private/MainThread/LayerContainers/Utility/CachedImageProvider.swift +47 -0
  79. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/CompositionLayersInitializer.swift +33 -24
  80. package/{lottie-swift/src/Private/LayerContainers/Utility/TextLayer.swift → Sources/Private/MainThread/LayerContainers/Utility/CoreTextRenderLayer.swift} +149 -106
  81. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/InvertedMatteLayer.swift +26 -24
  82. package/Sources/Private/MainThread/LayerContainers/Utility/LayerFontProvider.swift +41 -0
  83. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerImageProvider.swift +20 -16
  84. package/Sources/Private/MainThread/LayerContainers/Utility/LayerTextProvider.swift +40 -0
  85. package/{lottie-swift/src/Private → Sources/Private/MainThread}/LayerContainers/Utility/LayerTransformNode.swift +82 -67
  86. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Extensions/ItemsExtension.swift +9 -4
  87. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/NodeProperty.swift +29 -21
  88. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyNodeProperty.swift +16 -10
  89. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/AnyValueContainer.swift +6 -6
  90. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/KeypathSearchable.swift +5 -5
  91. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/Protocols/NodePropertyMap.swift +10 -8
  92. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueContainer.swift +25 -21
  93. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/GroupInterpolator.swift +23 -17
  94. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/NodeProperties/ValueProviders/SingleValueProvider.swift +22 -17
  95. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/ModifierNodes/TrimPathNode.swift +110 -79
  96. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/GroupOutputNode.swift +22 -16
  97. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PassThroughOutputNode.swift +19 -15
  98. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/PathOutputNode.swift +22 -20
  99. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/FillRenderer.swift +22 -23
  100. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift +247 -0
  101. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientStrokeRenderer.swift +30 -24
  102. package/{lottie-swift/src/Private/NodeRenderSystem/Nodes/OutputNodes/Renderables/GradientFillRenderer.swift → Sources/Private/MainThread/NodeRenderSystem/Nodes/OutputNodes/Renderables/LegacyGradientFillRenderer.swift} +93 -66
  103. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/OutputNodes/Renderables/StrokeRenderer.swift +23 -19
  104. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +139 -0
  105. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +170 -0
  106. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/RectNode.swift +95 -58
  107. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/ShapeNode.swift +42 -29
  108. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/PathNodes/StarNode.swift +108 -69
  109. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +155 -0
  110. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/FillNode.swift +51 -37
  111. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientFillNode.swift +57 -42
  112. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/RenderNodes/GradientStrokeNode.swift +66 -58
  113. package/Sources/Private/MainThread/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +169 -0
  114. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Nodes/Text/TextAnimatorNode.swift +138 -119
  115. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/AnimatorNode.swift +80 -79
  116. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/PathNode.swift +5 -3
  117. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/Protocols/RenderNode.swift +22 -17
  118. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeContainerLayer.swift +27 -24
  119. package/{lottie-swift/src/Private → Sources/Private/MainThread}/NodeRenderSystem/RenderLayers/ShapeRenderLayer.swift +34 -25
  120. package/Sources/Private/Model/Animation.swift +160 -0
  121. package/Sources/Private/Model/Assets/Asset.swift +43 -0
  122. package/{lottie-swift/src → Sources}/Private/Model/Assets/AssetLibrary.swift +40 -13
  123. package/Sources/Private/Model/Assets/ImageAsset.swift +112 -0
  124. package/{lottie-swift/src → Sources}/Private/Model/Assets/PrecompAsset.swift +20 -10
  125. package/Sources/Private/Model/DictionaryInitializable.swift +67 -0
  126. package/Sources/Private/Model/Extensions/Bundle.swift +34 -0
  127. package/{lottie-swift/src → Sources}/Private/Model/Extensions/KeyedDecodingContainerExtensions.swift +8 -4
  128. package/Sources/Private/Model/Keyframes/KeyframeData.swift +113 -0
  129. package/Sources/Private/Model/Keyframes/KeyframeGroup.swift +222 -0
  130. package/{lottie-swift/src → Sources}/Private/Model/Layers/ImageLayerModel.swift +21 -11
  131. package/Sources/Private/Model/Layers/LayerModel.swift +228 -0
  132. package/{lottie-swift/src → Sources}/Private/Model/Layers/PreCompLayerModel.swift +39 -22
  133. package/{lottie-swift/src → Sources}/Private/Model/Layers/ShapeLayerModel.swift +23 -12
  134. package/{lottie-swift/src → Sources}/Private/Model/Layers/SolidLayerModel.swift +31 -19
  135. package/{lottie-swift/src → Sources}/Private/Model/Layers/TextLayerModel.swift +33 -19
  136. package/Sources/Private/Model/Objects/DashPattern.swift +44 -0
  137. package/Sources/Private/Model/Objects/Marker.swift +33 -0
  138. package/Sources/Private/Model/Objects/Mask.swift +80 -0
  139. package/Sources/Private/Model/Objects/Transform.swift +179 -0
  140. package/Sources/Private/Model/ShapeItems/Ellipse.swift +74 -0
  141. package/Sources/Private/Model/ShapeItems/Fill.swift +74 -0
  142. package/Sources/Private/Model/ShapeItems/GradientFill.swift +137 -0
  143. package/Sources/Private/Model/ShapeItems/GradientStroke.swift +185 -0
  144. package/Sources/Private/Model/ShapeItems/Group.swift +48 -0
  145. package/{lottie-swift/src → Sources}/Private/Model/ShapeItems/Merge.swift +29 -12
  146. package/Sources/Private/Model/ShapeItems/Rectangle.swift +72 -0
  147. package/Sources/Private/Model/ShapeItems/Repeater.swift +135 -0
  148. package/Sources/Private/Model/ShapeItems/Shape.swift +56 -0
  149. package/Sources/Private/Model/ShapeItems/ShapeItem.swift +163 -0
  150. package/Sources/Private/Model/ShapeItems/ShapeTransform.swift +135 -0
  151. package/Sources/Private/Model/ShapeItems/Star.swift +131 -0
  152. package/Sources/Private/Model/ShapeItems/Stroke.swift +101 -0
  153. package/Sources/Private/Model/ShapeItems/Trim.swift +77 -0
  154. package/Sources/Private/Model/Text/Font.swift +61 -0
  155. package/{lottie-swift/src → Sources}/Private/Model/Text/Glyph.swift +63 -39
  156. package/Sources/Private/Model/Text/TextAnimator.swift +164 -0
  157. package/Sources/Private/Model/Text/TextDocument.swift +123 -0
  158. package/Sources/Private/RootAnimationLayer.swift +51 -0
  159. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/AnimatorNodeDebugging.swift +7 -7
  160. package/{lottie-swift/src → Sources}/Private/Utility/Debugging/LayerDebugging.swift +72 -48
  161. package/Sources/Private/Utility/Debugging/TestHelpers.swift +10 -0
  162. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/AnimationKeypathExtension.swift +69 -59
  163. package/Sources/Private/Utility/Extensions/BlendMode+Filter.swift +31 -0
  164. package/Sources/Private/Utility/Extensions/CGColor+RGB.swift +22 -0
  165. package/{lottie-swift/src → Sources}/Private/Utility/Extensions/CGFloatExtensions.swift +70 -67
  166. package/Sources/Private/Utility/Extensions/DataExtension.swift +27 -0
  167. package/Sources/Private/Utility/Extensions/MathKit.swift +450 -0
  168. package/Sources/Private/Utility/Extensions/StringExtensions.swift +38 -0
  169. package/{lottie-swift/src → Sources}/Private/Utility/Helpers/AnimationContext.swift +42 -16
  170. package/Sources/Private/Utility/Interpolatable/InterpolatableExtensions.swift +134 -0
  171. package/{lottie-swift/src → Sources}/Private/Utility/Interpolatable/KeyframeExtensions.swift +13 -10
  172. package/Sources/Private/Utility/Interpolatable/KeyframeGroup+Extensions.swift +59 -0
  173. package/{lottie-swift/src/Private/NodeRenderSystem/NodeProperties/ValueProviders → Sources/Private/Utility/Interpolatable}/KeyframeInterpolator.swift +125 -108
  174. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/BezierPath.swift +229 -143
  175. package/Sources/Private/Utility/Primitives/CGPointExtension.swift +35 -0
  176. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/ColorExtension.swift +46 -14
  177. package/{lottie-swift/src → Sources}/Private/Utility/Primitives/CompoundBezierPath.swift +58 -49
  178. package/Sources/Private/Utility/Primitives/CurveVertex.swift +184 -0
  179. package/Sources/Private/Utility/Primitives/PathElement.swift +75 -0
  180. package/Sources/Private/Utility/Primitives/UnitBezier.swift +115 -0
  181. package/Sources/Private/Utility/Primitives/VectorsExtensions.swift +341 -0
  182. package/Sources/Public/Animation/AnimationPublic.swift +266 -0
  183. package/Sources/Public/Animation/AnimationView.swift +1335 -0
  184. package/Sources/Public/Animation/AnimationViewInitializers.swift +109 -0
  185. package/Sources/Public/AnimationCache/AnimationCacheProvider.swift +22 -0
  186. package/{lottie-swift/src → Sources}/Public/AnimationCache/LRUAnimationCache.swift +22 -18
  187. package/Sources/Public/DynamicProperties/AnimationKeypath.swift +49 -0
  188. package/Sources/Public/DynamicProperties/AnyValueProvider.swift +132 -0
  189. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/ColorValueProvider.swift +54 -36
  190. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/FloatValueProvider.swift +40 -36
  191. package/Sources/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +123 -0
  192. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/PointValueProvider.swift +40 -35
  193. package/{lottie-swift/src → Sources}/Public/DynamicProperties/ValueProviders/SizeValueProvider.swift +40 -35
  194. package/{lottie-swift/src → Sources}/Public/FontProvider/AnimationFontProvider.swift +15 -8
  195. package/Sources/Public/ImageProvider/AnimationImageProvider.swift +21 -0
  196. package/Sources/Public/Keyframes/Interpolatable.swift +253 -0
  197. package/Sources/Public/Keyframes/Keyframe.swift +92 -0
  198. package/Sources/Public/Logging/LottieLogger.swift +137 -0
  199. package/Sources/Public/LottieConfiguration.swift +143 -0
  200. package/{lottie-swift/src → Sources}/Public/Primitives/AnimationTime.swift +1 -1
  201. package/{lottie-swift/src → Sources}/Public/Primitives/Color.swift +10 -6
  202. package/{lottie-swift/src → Sources}/Public/Primitives/Vectors.swift +13 -12
  203. package/Sources/Public/TextProvider/AnimationTextProvider.swift +53 -0
  204. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedButton.swift +42 -26
  205. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedControl.swift +100 -91
  206. package/{lottie-swift/src → Sources}/Public/iOS/AnimatedSwitch.swift +128 -94
  207. package/{lottie-swift/src → Sources}/Public/iOS/AnimationSubview.swift +3 -3
  208. package/Sources/Public/iOS/AnimationViewBase.swift +78 -0
  209. package/{lottie-swift/src → Sources}/Public/iOS/BundleImageProvider.swift +36 -34
  210. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationKeypath.swift +4 -0
  211. package/{lottie-swift/src → Sources}/Public/iOS/Compatibility/CompatibleAnimationView.swift +38 -29
  212. package/{lottie-swift/src → Sources}/Public/iOS/FilepathImageProvider.swift +24 -21
  213. package/{lottie-swift/src → Sources}/Public/iOS/UIColorExtension.swift +4 -4
  214. package/{lottie-swift/src/Public/MacOS/AnimationSubview.swift → Sources/Public/macOS/AnimationSubview.macOS.swift} +4 -5
  215. package/{lottie-swift/src/Public/MacOS/LottieView.swift → Sources/Public/macOS/AnimationViewBase.macOS.swift} +58 -50
  216. package/{lottie-swift/src/Public/MacOS/BundleImageProvider.swift → Sources/Public/macOS/BundleImageProvider.macOS.swift} +31 -32
  217. package/Sources/Public/macOS/FilepathImageProvider.macOS.swift +67 -0
  218. package/Tests/AnimationKeypathTests.swift +103 -0
  219. package/Tests/AutomaticEngineTests.swift +57 -0
  220. package/Tests/BundleTests.swift +25 -0
  221. package/Tests/DataURLTests.swift +64 -0
  222. package/Tests/ParsingTests.swift +43 -0
  223. package/Tests/PerformanceTests.swift +214 -0
  224. package/Tests/Samples/9squares_AlBoardman.json +1 -0
  225. package/Tests/Samples/Boat_Loader.json +1 -0
  226. package/Tests/Samples/HamburgerArrow.json +1 -0
  227. package/Tests/Samples/IconTransitions.json +1 -0
  228. package/Tests/Samples/Images/dog.png +0 -0
  229. package/Tests/Samples/Issues/issue_1125.json +1 -0
  230. package/Tests/Samples/Issues/issue_1260.json +1 -0
  231. package/Tests/Samples/Issues/issue_1403.json +1 -0
  232. package/Tests/Samples/Issues/issue_1407.json +1 -0
  233. package/Tests/Samples/Issues/issue_1460.json +1 -0
  234. package/Tests/Samples/Issues/issue_1488.json +1 -0
  235. package/Tests/Samples/Issues/issue_1505.json +1 -0
  236. package/Tests/Samples/Issues/issue_1541.json +1 -0
  237. package/Tests/Samples/Issues/issue_1557.json +1 -0
  238. package/Tests/Samples/Issues/issue_1603.json +1 -0
  239. package/Tests/Samples/Issues/issue_1628.json +1 -0
  240. package/Tests/Samples/Issues/issue_1636.json +1 -0
  241. package/Tests/Samples/Issues/issue_1643.json +1 -0
  242. package/Tests/Samples/Issues/issue_1655.json +1 -0
  243. package/Tests/Samples/Issues/issue_1664.json +1 -0
  244. package/Tests/Samples/Issues/issue_1683.json +1 -0
  245. package/Tests/Samples/Issues/issue_1687.json +1 -0
  246. package/Tests/Samples/Issues/issue_1711.json +1 -0
  247. package/Tests/Samples/Issues/issue_1717.json +1 -0
  248. package/Tests/Samples/Issues/issue_769.json +1 -0
  249. package/Tests/Samples/Issues/issue_885.json +1 -0
  250. package/Tests/Samples/Issues/issue_965.json +1 -0
  251. package/Tests/Samples/Issues/pr_1536.json +1 -0
  252. package/Tests/Samples/Issues/pr_1563.json +8439 -0
  253. package/Tests/Samples/Issues/pr_1592.json +5527 -0
  254. package/Tests/Samples/Issues/pr_1599.json +738 -0
  255. package/Tests/Samples/Issues/pr_1604_1.json +1 -0
  256. package/Tests/Samples/Issues/pr_1604_2.json +1 -0
  257. package/Tests/Samples/Issues/pr_1632_1.json +1 -0
  258. package/Tests/Samples/Issues/pr_1632_2.json +1 -0
  259. package/Tests/Samples/Issues/pr_1686.json +513 -0
  260. package/Tests/Samples/Issues/pr_1698.json +1 -0
  261. package/Tests/Samples/Issues/pr_1699.json +1 -0
  262. package/Tests/Samples/LottieFiles/LICENSE.md +14 -0
  263. package/Tests/Samples/LottieFiles/bounce_strokes.json +1 -0
  264. package/Tests/Samples/LottieFiles/cactus.json +1 -0
  265. package/Tests/Samples/LottieFiles/dog_car_ride.json +1 -0
  266. package/Tests/Samples/LottieFiles/draft_icon.json +1 -0
  267. package/Tests/Samples/LottieFiles/fireworks.json +1 -0
  268. package/Tests/Samples/LottieFiles/gradient_1.json +1 -0
  269. package/Tests/Samples/LottieFiles/gradient_2.json +1 -0
  270. package/Tests/Samples/LottieFiles/gradient_pill.json +1 -0
  271. package/Tests/Samples/LottieFiles/gradient_shapes.json +1 -0
  272. package/Tests/Samples/LottieFiles/gradient_square.json +1 -0
  273. package/Tests/Samples/LottieFiles/growth.json +1 -0
  274. package/Tests/Samples/LottieFiles/infinity_loader.json +1 -0
  275. package/Tests/Samples/LottieFiles/loading_dots_1.json +1 -0
  276. package/Tests/Samples/LottieFiles/loading_dots_2.json +1 -0
  277. package/Tests/Samples/LottieFiles/loading_dots_3.json +1 -0
  278. package/Tests/Samples/LottieFiles/loading_gradient_strokes.json +1 -0
  279. package/Tests/Samples/LottieFiles/settings_slider.json +1 -0
  280. package/Tests/Samples/LottieFiles/shop.json +1 -0
  281. package/Tests/Samples/LottieFiles/step_loader.json +1 -0
  282. package/Tests/Samples/LottieLogo1.json +1 -0
  283. package/Tests/Samples/LottieLogo1_masked.json +1 -0
  284. package/Tests/Samples/LottieLogo2.json +1 -0
  285. package/Tests/Samples/MotionCorpse_Jrcanest.json +1 -0
  286. package/Tests/Samples/Nonanimating/BasicLayers.json +1 -0
  287. package/Tests/Samples/Nonanimating/DisableNodesTest.json +1 -0
  288. package/Tests/Samples/Nonanimating/FirstText.json +1 -0
  289. package/Tests/Samples/Nonanimating/GeometryTransformTest.json +1 -0
  290. package/Tests/Samples/Nonanimating/Text_AnimatedProperties.json +1 -0
  291. package/Tests/Samples/Nonanimating/Text_Glyph.json +1 -0
  292. package/Tests/Samples/Nonanimating/Text_NoAnimation.json +1 -0
  293. package/Tests/Samples/Nonanimating/Text_NoGlyph.json +1 -0
  294. package/Tests/Samples/Nonanimating/Zoom.json +1 -0
  295. package/Tests/Samples/Nonanimating/_dog.json +1 -0
  296. package/Tests/Samples/Nonanimating/base64Test.json +1 -0
  297. package/Tests/Samples/Nonanimating/blend_mode_test.json +1 -0
  298. package/Tests/Samples/Nonanimating/keypathTest.json +1 -0
  299. package/Tests/Samples/Nonanimating/verifyLineHeight.json +1 -0
  300. package/Tests/Samples/PinJump.json +1 -0
  301. package/Tests/Samples/Switch.json +1 -0
  302. package/Tests/Samples/Switch_States.json +1 -0
  303. package/Tests/Samples/TwitterHeart.json +1 -0
  304. package/Tests/Samples/TwitterHeartButton.json +1 -0
  305. package/Tests/Samples/TypeFace/A.json +1 -0
  306. package/Tests/Samples/TypeFace/Apostrophe.json +1 -0
  307. package/Tests/Samples/TypeFace/B.json +1 -0
  308. package/Tests/Samples/TypeFace/BlinkingCursor.json +1 -0
  309. package/Tests/Samples/TypeFace/C.json +1 -0
  310. package/Tests/Samples/TypeFace/Colon.json +1 -0
  311. package/Tests/Samples/TypeFace/Comma.json +1 -0
  312. package/Tests/Samples/TypeFace/D.json +1 -0
  313. package/Tests/Samples/TypeFace/E.json +1 -0
  314. package/Tests/Samples/TypeFace/F.json +1 -0
  315. package/Tests/Samples/TypeFace/G.json +1 -0
  316. package/Tests/Samples/TypeFace/H.json +1 -0
  317. package/Tests/Samples/TypeFace/I.json +1 -0
  318. package/Tests/Samples/TypeFace/J.json +1 -0
  319. package/Tests/Samples/TypeFace/K.json +1 -0
  320. package/Tests/Samples/TypeFace/L.json +1 -0
  321. package/Tests/Samples/TypeFace/M.json +1 -0
  322. package/Tests/Samples/TypeFace/N.json +1 -0
  323. package/Tests/Samples/TypeFace/O.json +1 -0
  324. package/Tests/Samples/TypeFace/P.json +1 -0
  325. package/Tests/Samples/TypeFace/Q.json +1 -0
  326. package/Tests/Samples/TypeFace/R.json +1 -0
  327. package/Tests/Samples/TypeFace/S.json +1 -0
  328. package/Tests/Samples/TypeFace/T.json +1 -0
  329. package/Tests/Samples/TypeFace/U.json +1 -0
  330. package/Tests/Samples/TypeFace/V.json +1 -0
  331. package/Tests/Samples/TypeFace/W.json +1 -0
  332. package/Tests/Samples/TypeFace/X.json +1 -0
  333. package/Tests/Samples/TypeFace/Y.json +1 -0
  334. package/Tests/Samples/TypeFace/Z.json +1 -0
  335. package/Tests/Samples/Watermelon.json +1 -0
  336. package/Tests/Samples/setValueTest.json +1 -0
  337. package/Tests/Samples/timeremap.json +1 -0
  338. package/Tests/Samples/vcTransition1.json +1 -0
  339. package/Tests/Samples/vcTransition2.json +1 -0
  340. package/Tests/SnapshotConfiguration.swift +158 -0
  341. package/Tests/SnapshotTests.swift +265 -0
  342. package/Tests/Utils/Bundle+Module.swift +30 -0
  343. package/Tests/Utils/HardcodedFontProvider.swift +19 -0
  344. package/Tests/Utils/HardcodedImageProvider.swift +23 -0
  345. package/Tests/Utils/Snapshotting+presentationLayer.swift +47 -0
  346. package/Tests/ValueProvidersTests.swift +27 -0
  347. package/lottie-ios.podspec +12 -12
  348. package/package.json +1 -1
  349. package/script/test-carthage/Cartfile +1 -0
  350. package/script/test-carthage/Cartfile.resolved +1 -0
  351. package/script/test-carthage/CarthageTest/AppDelegate.swift +26 -0
  352. package/script/test-carthage/CarthageTest/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  353. package/script/test-carthage/CarthageTest/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  354. package/script/test-carthage/CarthageTest/Assets.xcassets/Contents.json +6 -0
  355. package/script/test-carthage/CarthageTest/Base.lproj/LaunchScreen.storyboard +25 -0
  356. package/script/test-carthage/CarthageTest/Base.lproj/Main.storyboard +24 -0
  357. package/script/test-carthage/CarthageTest/Info.plist +66 -0
  358. package/script/test-carthage/CarthageTest/SceneDelegate.swift +10 -0
  359. package/script/test-carthage/CarthageTest/ViewController.swift +15 -0
  360. package/script/test-carthage/CarthageTest-macOS/AppDelegate.swift +7 -0
  361. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  362. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json +58 -0
  363. package/script/test-carthage/CarthageTest-macOS/Assets.xcassets/Contents.json +6 -0
  364. package/script/test-carthage/CarthageTest-macOS/Base.lproj/Main.storyboard +717 -0
  365. package/script/test-carthage/CarthageTest-macOS/CarthageTest_macOS.entitlements +10 -0
  366. package/script/test-carthage/CarthageTest-macOS/ViewController.swift +15 -0
  367. package/script/test-carthage/CarthageTest.xcodeproj/project.pbxproj +532 -0
  368. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  369. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  370. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  371. package/script/test-carthage/CarthageTest.xcodeproj/project.xcworkspace/xcuserdata/calstephens.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  372. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/cal.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  373. package/script/test-carthage/CarthageTest.xcodeproj/xcuserdata/calstephens.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  374. package/script/test-carthage/Mintfile +1 -0
  375. package/script/test-spm/LottieSPM.xcworkspace/contents.xcworkspacedata +7 -0
  376. package/script/test-spm/LottieSPM.xcworkspace/xcuserdata/cal.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  377. package/script/test-spm/Mintfile +1 -0
  378. package/.swiftpm/xcode/package.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  379. package/Lottie/Info.plist +0 -22
  380. package/Lottie.xcodeproj/project.xcworkspace/xcuserdata/brandonwithrow.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  381. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/LottieLibraryMacOS.xcscheme +0 -80
  382. package/Lottie.xcodeproj/xcuserdata/brandonwithrow.xcuserdatad/xcschemes/xcschememanagement.plist +0 -57
  383. package/lottie-swift/Assets/.gitkeep +0 -0
  384. package/lottie-swift/src/Private/LayerContainers/Utility/LayerFontProvider.swift +0 -37
  385. package/lottie-swift/src/Private/LayerContainers/Utility/LayerTextProvider.swift +0 -36
  386. package/lottie-swift/src/Private/Model/Animation.swift +0 -107
  387. package/lottie-swift/src/Private/Model/Assets/Asset.swift +0 -27
  388. package/lottie-swift/src/Private/Model/Assets/ImageAsset.swift +0 -48
  389. package/lottie-swift/src/Private/Model/Keyframes/Keyframe.swift +0 -128
  390. package/lottie-swift/src/Private/Model/Keyframes/KeyframeGroup.swift +0 -108
  391. package/lottie-swift/src/Private/Model/Layers/LayerModel.swift +0 -150
  392. package/lottie-swift/src/Private/Model/Objects/DashPattern.swift +0 -24
  393. package/lottie-swift/src/Private/Model/Objects/Marker.swift +0 -23
  394. package/lottie-swift/src/Private/Model/Objects/Mask.swift +0 -48
  395. package/lottie-swift/src/Private/Model/Objects/Transform.swift +0 -105
  396. package/lottie-swift/src/Private/Model/ShapeItems/Ellipse.swift +0 -50
  397. package/lottie-swift/src/Private/Model/ShapeItems/FillI.swift +0 -49
  398. package/lottie-swift/src/Private/Model/ShapeItems/GradientFill.swift +0 -86
  399. package/lottie-swift/src/Private/Model/ShapeItems/GradientStroke.swift +0 -125
  400. package/lottie-swift/src/Private/Model/ShapeItems/Group.swift +0 -32
  401. package/lottie-swift/src/Private/Model/ShapeItems/Rectangle.swift +0 -50
  402. package/lottie-swift/src/Private/Model/ShapeItems/Repeater.swift +0 -80
  403. package/lottie-swift/src/Private/Model/ShapeItems/Shape.swift +0 -37
  404. package/lottie-swift/src/Private/Model/ShapeItems/ShapeItem.swift +0 -95
  405. package/lottie-swift/src/Private/Model/ShapeItems/ShapeTransform.swift +0 -68
  406. package/lottie-swift/src/Private/Model/ShapeItems/Star.swift +0 -86
  407. package/lottie-swift/src/Private/Model/ShapeItems/Stroke.swift +0 -67
  408. package/lottie-swift/src/Private/Model/ShapeItems/Trim.swift +0 -53
  409. package/lottie-swift/src/Private/Model/Text/Font.swift +0 -35
  410. package/lottie-swift/src/Private/Model/Text/TextAnimator.swift +0 -99
  411. package/lottie-swift/src/Private/Model/Text/TextDocument.swift +0 -70
  412. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/EllipseNode.swift +0 -109
  413. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/PathNodes/PolygonNode.swift +0 -132
  414. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderContainers/GroupNode.swift +0 -141
  415. package/lottie-swift/src/Private/NodeRenderSystem/Nodes/RenderNodes/StrokeNode.swift +0 -127
  416. package/lottie-swift/src/Private/Utility/Extensions/MathKit.swift +0 -539
  417. package/lottie-swift/src/Private/Utility/Extensions/StringExtensions.swift +0 -32
  418. package/lottie-swift/src/Private/Utility/Interpolatable/Interpolatable.swift +0 -18
  419. package/lottie-swift/src/Private/Utility/Interpolatable/InterpolatableExtensions.swift +0 -170
  420. package/lottie-swift/src/Private/Utility/Primitives/CurveVertex.swift +0 -177
  421. package/lottie-swift/src/Private/Utility/Primitives/PathElement.swift +0 -68
  422. package/lottie-swift/src/Private/Utility/Primitives/VectorsExtensions.swift +0 -218
  423. package/lottie-swift/src/Public/Animation/AnimationPublic.swift +0 -196
  424. package/lottie-swift/src/Public/Animation/AnimationView.swift +0 -1006
  425. package/lottie-swift/src/Public/Animation/AnimationViewInitializers.swift +0 -83
  426. package/lottie-swift/src/Public/AnimationCache/AnimationCacheProvider.swift +0 -24
  427. package/lottie-swift/src/Public/DynamicProperties/AnimationKeypath.swift +0 -46
  428. package/lottie-swift/src/Public/DynamicProperties/AnyValueProvider.swift +0 -29
  429. package/lottie-swift/src/Public/DynamicProperties/ValueProviders/GradientValueProvider.swift +0 -114
  430. package/lottie-swift/src/Public/ImageProvider/AnimationImageProvider.swift +0 -23
  431. package/lottie-swift/src/Public/MacOS/FilepathImageProvider.swift +0 -67
  432. package/lottie-swift/src/Public/TextProvider/AnimationTextProvider.swift +0 -39
  433. package/lottie-swift/src/Public/iOS/LottieView.swift +0 -62
  434. 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
- Lottie comes prepacked with a two Animated Controls, `AnimatedSwitch` and
14
- `AnimatedButton`. Both of these controls are built on top of `AnimatedControl`
15
-
16
- `AnimatedControl` is a subclass of `UIControl` that provides an interactive
17
- mechanism for controlling the visual state of an animation in response to
18
- user actions.
19
-
20
- The `AnimatedControl` will show and hide layers depending on the current
21
- `UIControl.State` of the control.
22
-
23
- Users of `AnimationControl` can set a Layer Name for each `UIControl.State`.
24
- When the state is change the `AnimationControl` will change the visibility
25
- of its layers.
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
- /// The speed of the animation playback. Defaults to 1
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(animation: Animation) {
67
- self.animationView = AnimationView(animation: animation)
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
- self.animationView = AnimationView()
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
- self.animationView = AnimationView()
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 override var intrinsicContentSize: CGSize {
125
- return animationView.intrinsicContentSize
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
- open func animationDidSet() {
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
- var stateMap: [UInt : String] = [:]
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
- An interactive switch with an 'On' and 'Off' state. When the user taps on the
14
- switch the state is toggled and the appropriate animation is played.
15
-
16
- Both the 'On' and 'Off' have an animation play range associated with their state.
17
- */
18
- final public class AnimatedSwitch: AnimatedControl {
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 // does not update the animation when canceled
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
- return _isOn
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(fromProgress: AnimationProgressTime,
50
- toProgress: AnimationProgressTime,
51
- forOnState: Bool) {
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 init() {
80
- /// Generate a haptic generator if available.
81
- #if os(iOS)
82
- if #available(iOS 10.0, *) {
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
- required public init?(coder aDecoder: NSCoder) {
96
- /// Generate a haptic generator if available.
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
- fileprivate var onStartProgress: CGFloat = 0
111
- fileprivate var onEndProgress: CGFloat = 1
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 realtimeProgress.isInRange(min(previousStateStart, previousStateEnd),
131
- max(previousStateStart, previousStateEnd)) {
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
- self.hapticGenerator.generateImpact()
166
+ hapticGenerator.generateImpact()
147
167
  }
148
168
 
149
- animationView.play(fromProgress: startProgress, toProgress: endProgress, loopMode: LottieLoopMode.playOnce) { (finished) in
150
- if finished == true {
151
- self.animationView.currentProgress = finalProgress
152
- }
153
- }
154
- }
155
-
156
- public override func endTracking(_ touch: UITouch?, with event: UIEvent?) {
157
- super.endTracking(touch, with: event)
158
- updateOnState(isOn: !_isOn, animated: true, shouldFireHaptics: true)
159
- sendActions(for: .valueChanged)
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
@@ -11,10 +11,10 @@ import UIKit
11
11
 
12
12
  /// A view that can be added to a keypath of an AnimationView
13
13
  public final class AnimationSubview: UIView {
14
-
14
+
15
15
  var viewLayer: CALayer? {
16
- return layer
16
+ layer
17
17
  }
18
-
18
+
19
19
  }
20
20
  #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