Trails of values over time in SwiftUI


works on iOS, tvOS, watchOS and macOS


Swift Package

.package(url: "", from: "1.1.1")


import SwiftUI
import Trails
struct ContentView: View {
    var main: Main = Main()
    var body: some View {
        TrailsView(trailer: main.trailer)
class Main {
    let trailer: Trailer
    init() {
        let trailCount: Int = 3
        let seconds: Double = 10.0
        trailer = Trailer(count: trailCount,
                          duration: seconds)
        trailer.circlesActive = true
    func startTimer()  {
        let startDate: Date = Date()
        let timer: Timer = Timer(timeInterval: 0.5, repeats: true) { _ in
            let time: Double = -startDate.timeIntervalSinceNow
            let valueA: Double = cos(time)
            let valueB: Double = cos(time + (.pi * 2) * (1.0 / 3.0))
            let valueC: Double = cos(time + (.pi * 2) * (2.0 / 3.0))
            self.trailer.add(valueA, at: 0)
            self.trailer.add(valueB, at: 1)
            self.trailer.add(valueC, at: 2)
        RunLoop.current.add(timer, forMode: .common)


trailer.duration = 10.0

duration is in seconds

.duration can be changed while running

values added longer ago than the duration will be removed

trailer.circlesActive = true

.circlesActive default is false

trailer.circleBorder = false
trailer.circleRadius = 2.0

.circleBorder default is true

.circleRadius default is 3.0

trailer.lineWidth = 3.0

.lineWidth default is 1.0

trailer.colorsActive = false

when count is 1, .colorsActive is false by default

when count is 2 or more, .colorsActive is true by default

trailer.hues = [0.0, 0.1, 0.2]

the number of hues must match the count passed to Trailer

.hues is "rainbow" by default

a hue is a value between 0.0 and 1.0, low values: red to green, middle values: green to blue, high values: blue to red

trailer.colorBlend = false

when .colorBlend is false the lines will not be blended. this option is visible when a lot of lines overlap

when .colorBlend is true, light mode blends with .multiply, dark mode blends with .lighten

.colorBlend is true by default

trailer.drawValueEndLines = false

.drawValueEndLines is true by default

trailer.drawValueBackground = false

.drawValueBackground is true by default on iOS and watchOS can be useful to turn to false if your background is transparent

trailer.drawDefaultTextBackground = false

.drawValueBackground is true by default on iOS and watchOS can be useful to turn to false if your background is transparent

trailer.fontSize = 12.0

.fontSize is 8.0 by default

trailer.leftSpacing = 10.0
trailer.rightSpacing = 10.0

.leftSpacing and .rightSpacing is 20.0 by default


To repilcate the randomness seen in the gifs in the top of this readme, use this code:

let trailer: Trailer = TrailerMock.make()

provided by TrailerMock.swift


  • Swift Tools 5.2.0
View More Packages from this Author


  • None
Last updated: Wed Feb 28 2024 02:11:47 GMT-1000 (Hawaii-Aleutian Standard Time)