NEW: My new book Pro SwiftUI is out now – level up your SwiftUI skills today! >>

How to create a marching ants border effect

Paul Hudson    @twostraws   

Updated for Xcode 14.0 beta 1

SwiftUI’s stroke can be configured with dash and dash phase options that gives us very fine-grained control over how the line is drawn. For example, we could draw a box with a dashed stroke like this:

struct ContentView: View {
    var body: some View {
        Rectangle()
            .strokeBorder(style: StrokeStyle(lineWidth: 4, dash: [10]))
    }
}

Download this as an Xcode project

A dotted line outlining a rectangular area.

Using [10] for the dash parameter means SwiftUI will draw 10 points of our stroke then 10 points of space, repeating that pattern until the entire rectangle has been stroked. It’s an array because you can provide more than one value, such as [10, 5], to mean “10 points of stroke then a 5-point gap.”

Where this becomes really interesting is when you add in the dash phase, which dictates where the dashes and gaps should be positioned. If we store that phase in a state property, we can then animate that value over time to create a so-called marching ants effect – a dashed stroke that moves around a shape, which is commonly used to signal object selection.

In code it looks like this:

struct ContentView: View {
    @State private var phase = 0.0

    var body: some View {
        Rectangle()
            .strokeBorder(style: StrokeStyle(lineWidth: 4, dash: [10], dashPhase: phase))
            .frame(width: 200, height: 200)
            .onAppear {
                withAnimation(.linear.repeatForever(autoreverses: false)) {
                    phase -= 20
                }
            }
    }
}

Download this as an Xcode project

Hacking with Swift is sponsored by MadMachine

SPONSORED Want to explore your Swift skill outside of the Apple world? Join the MadMachine community and start to program microcontrollers in Swift.

Get it now

Sponsor Hacking with Swift and reach the world's largest Swift community!

Similar solutions…

BUY OUR BOOKS
Buy Pro Swift Buy Pro SwiftUI Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let us know!

Average rating: 4.5/5

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.