diff --git a/Sources/AnimationPlanner/Protocols/AnimationModifiers.swift b/Sources/AnimationPlanner/Protocols/AnimationModifiers.swift index 77a4199..11e48e7 100644 --- a/Sources/AnimationPlanner/Protocols/AnimationModifiers.swift +++ b/Sources/AnimationPlanner/Protocols/AnimationModifiers.swift @@ -13,6 +13,9 @@ public protocol AnimationModifiers: Animation { /// - Note: Using `.repeats` will break expected behavior when used in a sequence func options(_ options: UIView.AnimationOptions) -> Self + /// Enables interaction on your parent views while this animation is running + func allowUserInteraction() -> Self + /// Sets a `CAMediaTimingFunction` for the animation. Overwrites possible previously set functions. /// /// Overrides any animation curves previously set with ``timingFunction(_:)`` @@ -36,6 +39,9 @@ extension Animate: AnimationModifiers { // Update options by creating a union of existing options mutate { $0.options = $0.options?.union(options) ?? options } } + public func allowUserInteraction() -> Animate { + mutate { $0.options = ($0.options ?? []).union(.allowUserInteraction) } + } public func timingFunction(_ function: CAMediaTimingFunction) -> Self { mutate { $0.timingFunction = function} } @@ -127,6 +133,9 @@ extension AnimateSpring: AnimationModifiers where Contained: AnimationModifiers public func options(_ options: UIView.AnimationOptions) -> Self { mutate { $0.animation = animation.options(options) } } + public func allowUserInteraction() -> AnimateSpring { + mutate { $0.animation = animation.allowUserInteraction() } + } public func timingFunction(_ function: CAMediaTimingFunction) -> Self { mutate { $0.animation = animation.timingFunction(function) } } @@ -140,6 +149,9 @@ extension AnimateDelayed: AnimationModifiers where Contained: Animation & Animat public func options(_ options: UIView.AnimationOptions) -> Self { mutate { $0.animation = animation.options(options) } } + public func allowUserInteraction() -> AnimateDelayed { + mutate { $0.animation = animation.allowUserInteraction() } + } public func timingFunction(_ function: CAMediaTimingFunction) -> Self { mutate { $0.animation = animation.timingFunction(function) } } diff --git a/Tests/AnimationPlannerTests/BuilderTests.swift b/Tests/AnimationPlannerTests/BuilderTests.swift index 2ceeba1..83d75c0 100644 --- a/Tests/AnimationPlannerTests/BuilderTests.swift +++ b/Tests/AnimationPlannerTests/BuilderTests.swift @@ -14,6 +14,10 @@ class BuilderTests: AnimationPlannerTests { let simplerSpring = AnimateSpring(duration: 1, dampingRatio: 2) XCTAssertEqual(spring.dampingRatio, simplerSpring.dampingRatio) XCTAssertEqual(spring.duration, simplerSpring.duration) + let springOptions = spring.options ?? [] + XCTAssertFalse(springOptions.contains(.allowUserInteraction)) + let editedOptions = spring.allowUserInteraction().options ?? [] + XCTAssertTrue(editedOptions.contains(.allowUserInteraction)) let delay = spring.delayed(3) XCTAssertEqual(delay.duration, spring.duration + delay.delay)