diff --git a/Package.swift b/Package.swift index a27f82d..7e6bb2a 100644 --- a/Package.swift +++ b/Package.swift @@ -10,7 +10,8 @@ let package = Package( platforms: [ .iOS(.v15), .macOS(.v12), - .macCatalyst(.v15) + .macCatalyst(.v15), + .tvOS(.v15) ], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. diff --git a/README.md b/README.md index da78233..866b4b1 100644 --- a/README.md +++ b/README.md @@ -216,7 +216,7 @@ static func shine(angle: Angle, duration: Double = 1.0) -> AnyChangeEffect Triggers a sound effect as feedback whenever a value changes. -This effect will not interrupt or duck any other audio that may currently playing. It may also not triggered based on the setting of the user's silent switch or playback device. +This effect will not interrupt or duck any other audio that may be currently playing. This effect is not guaranteed to be triggered; the effect running depends on the user's silent switch position and the current playback device. To relay important information to the user, you should always accompany audio effects with visual cues. diff --git a/Sources/Pow/Effects/SmokeEffect.swift b/Sources/Pow/Effects/SmokeEffect.swift index 660ed7f..d661c76 100644 --- a/Sources/Pow/Effects/SmokeEffect.swift +++ b/Sources/Pow/Effects/SmokeEffect.swift @@ -57,7 +57,7 @@ private struct SmokeEffect: ViewModifier, Continuous { GeometryReader { proxy in ZStack { ForEach(Array(particles.enumerated()), id: \.element) { (offset, particle) in - #if os(iOS) || os(visionOS) + #if os(iOS) || os(visionOS) || os(tvOS) let image = UIImage(named: particle, in: .module, with: nil)!.cgImage! #elseif os(macOS) let image = Bundle.module.image(forResource: particle)!.cgImage(forProposedRect: nil, context: nil, hints: nil)! @@ -70,7 +70,7 @@ private struct SmokeEffect: ViewModifier, Continuous { } } -#if os(iOS) || os(visionOS) +#if os(iOS) || os(visionOS) || os(tvOS) private class EmitterView: UIView { override class var layerClass : AnyClass { return CAEmitterLayer.self @@ -172,7 +172,7 @@ private struct SmokeLayerView: ViewRepresentable { } } -#if DEBUG +#if DEBUG && !os(tvOS) struct ContinuousParticleEffect_Previews: PreviewProvider { private struct Preview: View { @State diff --git a/Sources/Pow/Extensions/Duration+TimeInterval.swift b/Sources/Pow/Extensions/Duration+TimeInterval.swift index 7375eb6..5436a33 100644 --- a/Sources/Pow/Extensions/Duration+TimeInterval.swift +++ b/Sources/Pow/Extensions/Duration+TimeInterval.swift @@ -2,6 +2,7 @@ import Foundation @available(iOS 16.0, *) @available(macOS 13.0, *) +@available(tvOS 16.0, *) internal extension Duration { var timeInterval: TimeInterval { TimeInterval(components.seconds) + TimeInterval(components.attoseconds) / 1e18 diff --git a/Sources/Pow/Infrastructure/AngleControl.swift b/Sources/Pow/Infrastructure/AngleControl.swift index 564c194..9941fac 100644 --- a/Sources/Pow/Infrastructure/AngleControl.swift +++ b/Sources/Pow/Infrastructure/AngleControl.swift @@ -1,3 +1,4 @@ +#if !os(tvOS) import SwiftUI struct AngleControl: View { @@ -132,3 +133,4 @@ struct AngleControl_Previews: PreviewProvider { .padding() } } +#endif diff --git a/Sources/Pow/Infrastructure/WhileEffect.swift b/Sources/Pow/Infrastructure/WhileEffect.swift index 2de7d02..ea4cb21 100644 --- a/Sources/Pow/Infrastructure/WhileEffect.swift +++ b/Sources/Pow/Infrastructure/WhileEffect.swift @@ -54,6 +54,7 @@ public struct AnyConditionalEffect { /// - interval: The duration between each change effect. @available(iOS 16.0, *) @available(macOS 13.0, *) + @available(tvOS 16.0, *) public static func `repeat`(_ effect: AnyChangeEffect, every interval: Duration) -> AnyConditionalEffect { AnyConditionalEffect(guts: .repeating(effect, interval.timeInterval)) }